7

为什么以下工作:

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

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

到底是怎么回事?

4

5 回答 5

17

for 的第一个参数Function.prototype.callcontext,它定义了this被调用函数的执行上下文的值,仅此而已。

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

在非严格模式下,thiscannot be null,所以它被替换为全局对象

于 2012-07-25T21:49:16.203 回答
12

当你使用.callor.applynullor时,如果不是在严格模式下undefined,默认this(通常)会自动使用。window

来自MDN(重点是我的):

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

如果您处于严格模式,它实际上将是nullor undefined

(function() {
    'use strict';

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

    return this;
})(); // undefined
于 2012-07-25T21:49:03.153 回答
4

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

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

于 2012-07-25T21:49:43.423 回答
1

例如,如MDN中所述,第一个参数是

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

于 2012-07-25T21:52:31.950 回答
0

正如 MDN 解释的那样。

这个Arg

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

简单地说就是一小段代码。

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

    </script>

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

于 2014-05-23T06:56:24.103 回答