标签:
(function(){ console.log(this === window); // true }).call(this); (function(){ console.log(this === window); // true })();
严格模式
(function(){ "use strict"; console.log(this === window); // true }).call(this); (function(){ "use strict"; console.log(this === window); // false })();
严格模式下函数调用 this 並不会默认成为全局对象。
使用 func.call(this) 确保函数调用的 this 指向调用函数时的 this(即全局对象)。也可以说主要是隔离上下文,避免变量冲突。
在严格模式下,所有变量都必须要显示声明,如果不用 call() 传递 this 给这个函数,那么就会报错。因为你在函数里面有一个 return 语句,访问了 this 变量。严格模式,就必须这么写。
函数调用介绍:
js 里函数调用有4种模式:方法调用、正常函数调用、构造器函数调用、apply/call 调用。
同时,无论哪种函数调用除了声明时定义的形参外,还会自动添加2个形参,分别是 this 和 arguments。
this 的值,在上面4中调用模式下,分别会绑定不同的值。
方法调用:
这个很好理解,函数是一个对象的属性。
var a = { v : 0, f : function(xx) { this.v = xx; } } a.f(5);
上面函数里的 this 就绑定的是这个对象 a。所以 this.v 可以取到对象 a 的属性 v。
正常函数调用:
function f(xx) { this.x = xx; } f(5);
函数 f 里的 this 绑定的是全局对象,如果是在浏览器运行的解释器中,一般来说是 window 对象。所以这里 this.x 访问的其实是 window.x ,当然,如果 window 没有 x 属性,按照 js 语法,就是给 window 对象添加了一个 x 属性,同时赋值。
构造器函数调用:
如果在一个函数前面带上 new 关键字来调用,那么 js 会创建一个 prototype 属性是此函数的一个新对象,同时在调用这个函数的时候,把 this 绑定到这个新对象上。
function a(xx) { this.m = xx; } var b = new a(5);
this 绑定的不再是全局对象,而是创建的新对象。
apply/call 调用:
在 js 里,函数其实也是一个对象,函数可以拥有自己的方法。每个函数都拥有 apply() 方法,构造一个参数数组传递给函数,同时可以设置 this 的值,apply 接收2个参数,第一个是将传递给这个函数的 this 的值,第二个是参数数组。前面3种函数调用方法,this 都是自动绑定,没办法设值。
function a(xx) { this.b = xx; } var o = {}; a.apply(o, [5]); alert(a.b); // undefined alert(o.b); // 5
函数 a 给 o 加属性值。如果 apply 的第一个参数传递 null,那么在函数 a 里面 this 指针依然会绑定全局对象。apply 函数是哪来的, js 里所有的函数都有一个共同的 prototype,也就是 Function.prototype, 这个原型里有两个方法,一就是这里的 apply ,另一个就是 call。
call() 方法和 apply() 方法很类似,它们的存在都是为了改变 this 的绑定。
call() 和 apply() 区别?apply() 接收两个参数,第一个是想要 this 绑定的对象,第二个是一个参数数组,注意是一个数组,你想传递给这个函数的所有内容都放在数组里,然后 apply() 函数会在传递形参时自动帮你展开,同时加入我上面提到的另一个形参 arguments。而 call() ,第一个参数也是想要 this 绑定的对象,但是后面可以接受不定参数,而不再是一个数组,也就是可以像平时给函数传参那样把这些参数一个一个传递,当然,形参 arguments 还是不会少的。
function a(xx, yy) { alert(xx, yy); alert(this); alert(arguments); } a.apply(null, [5, 55]); a.call(null, 5, 55);
改变 this 可以让这个函数,使用 this 的方法,换句话说,就是你的函数可以针对不同的 this,来调用它们不同的方法,有点像反射机制。
标签:
原文地址:http://www.cnblogs.com/papajia/p/4653909.html