我正在努力学习如何编写更好的javascript,但我不确定为什么这不起作用。我有两个写入文本字段的方法调用。第一个很好用,但第二个不行。为什么在嵌套调用中未定义文本字段变量?任何帮助都将不胜感激:
(function () {
var TestObj = function (logEl) {
this.log = logEl;
};
TestObj.prototype = function () {
var log1 = function (text) {
this.log.val(text);
};
var log2 = function (text) {
log1(text);
}
return {
log1: log1,
log2: log2
};
}();
$(function () {
var logEl = $("#log");
var test = new TestObj(logEl);
test.log1("This Works");
test.log2("This Dosen't"); //this.log is undefined
});
})()
在第二种情况下,在没有任何上下文的情况下调用log1。从log2调用this
时的值将是全局对象,而不是TestObj的实例。
尝试将其更改为:
var log2 = function (text) {
this.log1(text);
}
演示小提琴
我认为问题与log2
:中未使用this
有关
var log2 = function (text) {
this.log1(text);
}
小提琴的例子:http://jsfiddle.net/y66YT/
As dc5和Hayes指出this
的值是调用对象。它是出现在函数之前的对象:
somebutton.click();//this is somebutton
click();//nothing before click, window is assumed or throw exception in strict mode
myObject.doSomething();//this in doSomething is myObject
由于log1通过闭包可用,它不会立即抛出异常(log1未定义(,但log1函数中的this
是窗口,因为log2没有提供调用对象。
要设置调用对象,可以将代码更改为:
log1.call(this,text);
我不太喜欢在IIFE中扔所有东西,包括厨房水槽,因为它会为每种方法创建不必要的盖子。您可以将应用程序包装为对象文字,并在实际需要闭包的地方使用IIFE:
var app ={
testObj:function(...
log1不能通过log2中的闭包使用,但您可以使用this
调用它
this.log1(text);
关于原型、构造函数、继承和this
的值的更多信息可以在这里找到。