在Javascript中将函数应用于Null

时间:2012-07-25 21:47:11

标签: javascript call

为什么以下工作:

function sum(a,b) { return a + b; }
var result = sum.call(null,3,4);     // 7

为什么要定义结果?我正在调用sum作为null的方法。但是null不是一个对象,不能有属性!

发生了什么事?

5 个答案:

答案 0 :(得分:17)

Function.prototype.call的第一个参数是 context ,它定义了被调用函数的执行上下文的this值,没有别的。

所以基本上,你说this指的是null(至少在ES5严格模式下),但是因为你无论如何都不访问this,没有区别。

在非严格模式下,this不能为null,因此会替换为全局对象

答案 1 :(得分:12)

.call.applynullundefined一起使用时,默认this(通常为window)会自动使用不是严格的模式。

来自MDN(强调我的):

  

thisArg
  this的值为fun的调用提供了。请注意,这可能不是方法看到的实际值:如果方法是非严格模式代码中的函数,则nullundefined将替换为全局对象,原始值将被加框。

如果 处于严格模式,它实际上将是nullundefined

(function() {
    'use strict';

    return this;
}).call(null); // null
(function() {
    'use strict';

    return this;
})(); // undefined

答案 2 :(得分:4)

不是。在这种情况下,NULL指定this关键字绑定到的对象。在您的方法中,通过将其设置为NULL,它将不具有this变量绑定,或者它将绑定到函数本身或窗口。

由于您没有使用通过this访问的任何变量或函数,因此无需使用调用方法......您只需使用sum(3,4)

答案 3 :(得分:1)

如上所述,MDN,第一个参数是

  

为[方法]的调用提供的值。注意   这可能不是方法看到的实际值:如果方法是   非严格模式代码中的函数,null和undefined将是   替换为全局对象,原始值将被加框。

答案 4 :(得分:0)

正如MDN解释的那样。

  

thisArg

     

为乐趣召唤提供的价值。请注意,这可能不是   是方法看到的实际值:如果方法是函数   在非严格模式代码中,null和undefined将替换为   全局对象和原始值将被装箱。

简单地用一点代码。

<script >
        'use strict'
        function fun() {
            alert(this);
        }
        fun.call(null);

    </script>

在严格模式下,这是null。但在不严格的模式。这是窗口或全局对象。