如何解释"这个"在这个例子中

时间:2015-02-25 21:24:33

标签: javascript

你好,我是一名javascript初学者,我读到了如何解释this关键字,但在这个例子中我仍然感到困惑:

<script>
function example(param) {
    this.a = param;
    var b = true;

    this.getB = function() {
        return b;
    }

    this.setB = function(x) {
        b = x;
    }
}
document.write(window.a); //prints "undefined" (line A)
document.write(window.b); //prints "undefined" (line B)
document.write(window.getB(); //generates an error "undefined is not a function (Line C)"

对于A行,我想解释是this指的是拥有函数example的对象,在本例中是窗口对象。因此,您可以引用window.a,但它没有定义,因此它会打印undefined

我无法理解Line B. Isn&#39; t var b将b限制在本地范围内?这应该意味着你只能在函数中引用b?我期待B行生成错误,而不是打印undefined

我对C行完全没有任何线索,为什么会产生错误,this在这种情况下意味着什么?

非常感谢!

3 个答案:

答案 0 :(得分:1)

this变量取决于函数的使用方式。

如果您实例化该函数(将其视为类),那么this将引用该类的实例:

new example("foo").getB(); // `this` is an instance of example

如果您使用Function.prototype.call进行调用,则this会引用您传递给call方法的任何对象:

example.call(anotherObject, "foo"); // `this` refers to anotherObject

如果你直接执行它,那么this可能会引用窗口或其他任何周围范围。

example("foo"); // `this` likely refers to the window object

你也可以使用Function.prototype.bind将你的功能包装在一个特定的范围内,以帮助清理:

var wrappedExample = example.bind(aSpecificObject);
wrappedExample(); // Doesn't matter how it's called, `this` will refer to aSpecificObject

当然,您可能需要在使用bind之前考虑目标浏览器(或使用polyfill)。

答案 1 :(得分:0)

首先 - 你永远不会调用example()函数。所以它没有任何效果。

第二 - 你在最后一行有语法错误,你错过了)

如果您要解决这些问题,结果会有所不同:

function example(param) {
    this.a = param;
    var b = true;

    this.getB = function() {
        return b;
    }

    this.setB = function(x) {
        b = x;
    }
}
example("data");
document.write(window.a); //prints "undefined" (line A)
document.write(window.b); //prints "undefined" (line B)
document.write(window.getB()); //generates an error "undefined is not a function (Line C)"

  

对于A行,我想解释的是“this”指的是拥有函数“example”的对象,在本例中是窗口对象。因此,您可以引用window.a,但它没有定义,因此它打印“undefined”

没有定义,因为你没有调用该函数。如果您要调用它,则将其定义为param的值。

  

我无法理解B行。是不是“var b”将b限制在本地范围内?这应该意味着你只能在函数中引用b?我期待B行产生错误,而不是打印“未定义”。

本地范围的变量b不同于b中存储的对象的this属性。

访问对象的未定义属性不会在JavaScript中引发错误,它会为您提供undefined

如果您要访问未声明的变量,则会出现参考错误。

  

我对C行完全没有任何线索,为什么会产生错误,在这种情况下“这个”是什么意思?

与其他示例一样,您不对行A,B或C使用this。您使用windowthis仅在函数内部使用。

您收到错误是因为您从未运行过此功能,因此从未设置window.getB。将undefined值作为函数调用会引发错误。

如果您解决了问题,如上所述,您将获得本地b变量的值。

答案 2 :(得分:0)

如果您在函数中使用它,它将引用全局窗口对象。

function whatsThis(){
    console.log(this); 
}
whatsThis(); //displays the window object

但是,如果函数存在于由构造函数创建的对象中,则这将引用父对象

var WhatsThis = function(){
   this.showThis = function(){
       console.log(this);
   };
 };

 var obj = new WhatsThis();
 obj.showThis(); //displays the instance of WhatsThis

与对象文字类似,这指的是包含对象。