(function(){})(this)

就是立即调用的函数表达式IIFE

(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,来调用它们不同的方法,有点像反射机制。

 

posted @ 2015-07-17 11:22  papahot  阅读(771)  评论(0编辑  收藏  举报