js重点浅谈(跨域,作用域和作用域链,闭包,原型和原型链继承)
2017-07-19 17:30
831 查看
一.跨域问题的解决方法
啥是跨域:
所有的浏览器都遵守同源策略,保证一个源的动态脚本不能读取或操作其他源的http响应和cookie,这就使浏览器隔离了来自不同源的内容,防止它们互相操作。所谓同源是指协议、域名和端口都一致的情况。
![](https://img-blog.csdn.net/20170719170606781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9ndWF0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
怎么解决跨域问题:
1.第三方网站开启HTTP的Access-Control-Allow-Origin参数
只有当目标页面的response中,包含了 Access-Control-Allow-Origin 这个header,并且它的值里有我们自己的域名时,浏览器才允许我们拿到它页面的数据进行下一步处理。如:Access-Control-Allow-Origin: http://run.jsbin.io。如果它的值设为 * ,则表示谁都可以用:Access-Control-Allow-Origin: *
2.Web页面上调用js文件时不受是否跨域的影响(不仅如此,别人还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如script、img、iframe)
静态调取js文件方式实现
![](https://img-blog.csdn.net/20170719171138782?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9ndWF0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
动态调取js文件方式实现
![](https://img-blog.csdn.net/20170719171247825?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9ndWF0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
动态获取callback函数
![](https://img-blog.csdn.net/20170719171353111?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9ndWF0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
使用JQuery处理JSONP
$.ajax函数判断dataType为jsonp时会自动加入callback函数,并在success中自动调取:
![](https://img-blog.csdn.net/20170719171442179?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9ndWF0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170719171548033?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9ndWF0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
二.作用域和作用域链
- 作用域:
最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如:
作用域链:
在试图访问一个变量时JS引擎会从当前作用域开始向上查找直到Global全局作用域停止。
至于为什么叫链, 可以理解为和链表有相似之处, 深层的作用域会能够访问到上层作用域, 就如同链表中两个连续节点能够单向访问一样。
三.闭包理解
指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
我理解其实是一个作用域(scope),而这个作用域就是闭包内部的函数可以访问和修改变量的范围
特性:- 函数嵌套函数 - 函数内部可以引用外部的参数和变量 - 参数和变量不会被垃圾回收机制回收
例子:闭包中局部变量是引用而非拷贝
四.原型和原型链继承
Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数也有原型。
原型链:当从一个对象那里调取属性或方法时,如果该对象自身不存在这样的属性或方法,就会去自己关联的prototype对象那里寻找,如果prototype没有,就会去prototype关联的前辈prototype那里寻找,如果再没有则继续查找Prototype.Prototype引用的对象,依次类推,直到Prototype.….Prototype为undefined(Object的Prototype就是undefined)从而形成了所谓的“原型链”。
啥是跨域:
所有的浏览器都遵守同源策略,保证一个源的动态脚本不能读取或操作其他源的http响应和cookie,这就使浏览器隔离了来自不同源的内容,防止它们互相操作。所谓同源是指协议、域名和端口都一致的情况。
怎么解决跨域问题:
1.第三方网站开启HTTP的Access-Control-Allow-Origin参数
只有当目标页面的response中,包含了 Access-Control-Allow-Origin 这个header,并且它的值里有我们自己的域名时,浏览器才允许我们拿到它页面的数据进行下一步处理。如:Access-Control-Allow-Origin: http://run.jsbin.io。如果它的值设为 * ,则表示谁都可以用:Access-Control-Allow-Origin: *
2.Web页面上调用js文件时不受是否跨域的影响(不仅如此,别人还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如script、img、iframe)
静态调取js文件方式实现
动态调取js文件方式实现
动态获取callback函数
使用JQuery处理JSONP
$.ajax函数判断dataType为jsonp时会自动加入callback函数,并在success中自动调取:
二.作用域和作用域链
- 作用域:
最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如:
var authorName="山边小溪"; function doSomething(){ var blogName="梦想天空"; function innerSay(){ alert(blogName); } innerSay(); } alert(authorName); //山边小溪 alert(blogName); //脚本错误 doSomething(); //梦想天空 innerSay() //脚本错误
作用域链:
在试图访问一个变量时JS引擎会从当前作用域开始向上查找直到Global全局作用域停止。
至于为什么叫链, 可以理解为和链表有相似之处, 深层的作用域会能够访问到上层作用域, 就如同链表中两个连续节点能够单向访问一样。
var A = '蓝天';//全局作用域 function B(){ var C = '白云';//C位于B函数的作用域 function D(){ var E = '梦想';//E位于D函数的作用域 alert(A) } D(); } B(); //蓝天
三.闭包理解
指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
我理解其实是一个作用域(scope),而这个作用域就是闭包内部的函数可以访问和修改变量的范围
特性:- 函数嵌套函数 - 函数内部可以引用外部的参数和变量 - 参数和变量不会被垃圾回收机制回收
例子:闭包中局部变量是引用而非拷贝
function say667() { var num = 666; var sayAlert = function() { alert(num); } num++; return sayAlert; } var sayAlert = say667(); sayAlert() //因此执行结果应该弹出的667而非666。
四.原型和原型链继承
Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数也有原型。
// 原型链式继承: function SuperType(){ this.a=true; } SuperType.prototype.getSuperValue=function(){ return this.a; } function SubType(){ this.b=false; } SubType.prototype = new SuperType();//继承 SubType.prototype.getSubValue=function(){//额外添加方法 return this.b; } var s = new SubType(); console.log(s.getSubValue());//false console.log(s.getSuperValue());//true
原型链:当从一个对象那里调取属性或方法时,如果该对象自身不存在这样的属性或方法,就会去自己关联的prototype对象那里寻找,如果prototype没有,就会去prototype关联的前辈prototype那里寻找,如果再没有则继续查找Prototype.Prototype引用的对象,依次类推,直到Prototype.….Prototype为undefined(Object的Prototype就是undefined)从而形成了所谓的“原型链”。
相关文章推荐
- 变量对象,作用域链,闭包,匿名函数,this关键字,原型链,构造器,js预编译,对象模型,执行模型,prototype继承
- JS变量提升、匿名函数、原型继承、作用域、闭包机制等。
- 最新今日头条面试题目(js闭包、原型、继承、作用域)(2016)
- 深入学习js之浅谈作用域(作用域闭包)
- JavaScript高级内容笔记:原型链、继承、执行上下文、作用域链、闭包
- js系列教程13-原型、原型链、作用链、闭包全解
- 作用域、上下文、闭包、原型、继承
- 浅谈js作用域和闭包
- Javascript 作用域 闭包 原型和原型链
- 高性能JavaScript---作用域链, 闭包, 原型, 原型链
- js 作用域,作用域链,闭包
- 一切皆对象之两个方法概括js,无函数签名(无多态),原型,闭包,封装,引用类型,继承……
- JS核心系列:浅谈 原型对象和原型链
- js作用域,作用域链以及闭包
- JS核心系列:浅谈原型对象和原型链
- JS核心系列:浅谈原型对象和原型链
- 浅谈JS原型对象和原型链
- js中原型,原型链,原型链继承的个人理解
- 浅谈js函数继承模式之三:共享原型模式
- 对于js原型和原型链继承的简单理解(第一种,原型链继承)