下面的JavaScript中,“this”代表什么?

3

(抱歉,又是一个关于JavaScript中this的问题。)

我有以下代码,并且想知道结尾处的' this '表示什么—— Window还是Bird?

var Bird = (function () {
    Bird.name = 'Bird';

    function Bird(name) {
        this.name = name;
    }

    Bird.prototype.move = function (feet) {
        return alert(this.name + (" flew" + feet + "ft."));
    };

    return Bird;

}).call(this);

1
我在一个空的脚本中测试了这个功能,通过在函数中添加一个参数x并在调用内部添加alert(x) - 结果是未定义的 - CodeClown42
2
@goldilocks,它不是这样工作的。当你使用call时,第一个参数是你正在执行的上下文/范围,它不会作为函数的参数传递。要正确测试你所建议的内容,可以尝试(function(){ console.log(this); }).call(this);。如果你想看到参数,请尝试(function(arg){ console.log(this, arg); }).call(this, this);。这两个测试都显示'this'是window - Matt
我的示例jsFiddle链接:http://jsfiddle.net/Umseu/1 - Matt
马特:啊,这很有道理——我尝试了 call(this, "okay"),而“okay”是定义Bird的匿名函数的第一个参数。使用“this,this”,它就是窗口。 - CodeClown42
4个回答

7

谢谢Matt。顺便问一下,你有没有在发布中贴代码的建议,以便格式保持不变?我注意到您更改了我的代码,这很好,但当我粘贴它时,缩进都乱了,我不得不使用空格来使其正常工作。 - larryq
@larryq 如果你是从编辑器中复制的内容,可能是缩进时使用了制表符(\t),而非空格。不确定。如果要快速清理JS代码,我只需要访问http://jsbeautifier.org/,这也是用于你代码的方式。 - Matt

5

可能是window,因为它没有任何特定的上下文可以赋予this任何特殊意义。


3

这句话中的 .call(this) 并不是写在 Bird 函数内部的。它只是调用一个匿名函数,该函数恰好返回 "Bird" 的构造函数。


1
在匿名函数的第一行调用console.log(this)。这将返回作用域window

在哪个函数内?代码中有三个函数 - 其中一些将实际引用Bird。在上面的代码后调用console.log(this); 将告诉答案。 - Simon Forsberg

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