你好,我是一名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
在这种情况下意味着什么?
非常感谢!
答案 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
。您使用window
。 this
仅在函数内部使用。
您收到错误是因为您从未运行过此功能,因此从未设置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
与对象文字类似,这指的是包含对象。