在Javascript中将一个函数应用于null

9
为什么以下内容有效:
function sum(a,b) { return a + b; }
var result = sum.call(null,3,4);     // 7

为什么要定义result?我正在将sum作为null的方法调用。但是null不是对象,不能具有属性!
发生了什么?

我们假设这是一个名为**sum(a,b)**的函数... - Alfabravo
sum.call(null,3,4) 这个代码将 this 定义为 null,因此它能够正常工作。 - Derek 朕會功夫
5个回答

18
Function.prototype.call的第一个参数是上下文(context),它为被调用函数的执行环境定义了this值,除此之外没有任何其他作用。

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

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


3
“this”不是上下文,它是执行上下文的一个组成部分。 - RobG
@RobG:我描述的方式可能会误导人。然而,this引用当前执行上下文的上下文/作用域对象。 - jAndy
jAndy - 引用作用域对象是不可能的(除了 with 提供的有限功能和全局对象的特殊情况外),ECMA-262 明确禁止(参见 §10.2 词法环境,最后一句)。另外 this 是执行上下文的组成部分之一(参见 §10.3 执行上下文),在那里也说访问执行上下文是不可能的。 - RobG
@RobG:哎,老兄,我对这门语言很了解,不需要再读那些链接了。你怎么了?我说的不是“作用域”和上下文对象的规范和实现。在这里,“上下文”的意思应该很明显了。 - jAndy
然而,我不想在这里引发争论。我猜你只是想挑剔一下,那没关系。但是,你和每个阅读这篇文章的人都应该能够识别出我所说的内容,那就是被this引用的ECMAScript对象。即使规范当然有不同的含义,将其称为“上下文”也是非常普遍的。 - jAndy

12
当您使用.call.applynullundefined一起使用时,如果不在严格模式下,则默认的this(通常为window)将自动替代。

来自MDN(重点是我的):

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

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

(function() {
    'use strict';

    return this;
}).call(null); // null

(function() {
    'use strict';

    return this;
})(); // undefined

我认为你引用 MDN 的内容不正确,请看 Alfabravo 的回答。 - Fawkes5
1
@Fawkes5:也许如果你认为我没有正确引用MDN的话,你可以跟随我提供的MDN链接亲自查看,看看它是否完全相同?Alfabravo的回答和我的唯一区别是“fun”(原始文本)和强调(我已经说过是我的)。 - Ry-
我知道,但第一句话中的thisArg和'fun'是什么意思? - Fawkes5
1
@Fawkes5:fun是函数的名称。thisArg.call的第一个参数的名称。(再次强调 - 请查看文档。) - Ry-
啊,我明白了。不过这句话好像脱离了上下文。 - Fawkes5

4

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

由于您没有使用通过this访问的任何变量或函数,因此不需要使用call方法……只需使用sum(3,4)即可。


1

MDN所述,第一个参数是

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


-1

正如MDN所解释的。

thisArg

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

简单来说,就是通过一小段代码实现。

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

    </script>

在严格模式下,this 为 null。但是,在非严格模式下,this 是 window 或全局对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接