我在javascript中有一个带有属性(is_initialized
)和函数(isInitialized
)的类。
课程定义:
function Test()
{
this.is_initialized = { obj: { isInitialized: 'notyet' } };
this.isInitialized = function( ref )
{
if ( !ref.obj )
{
console.log( 'now: ' + JSON.stringify( this.is_initialized ) );
/*line 9*/ this.is_initialized.obj.isInitialized = ref.isInitialized.toString();
console.log( ref );
}
else {
bluetoothle.isInitialized( this.isInitialized );
/*line 14*/ ref.obj = this.is_initialized.obj;
}
};
}
bluetoothle.isInitialized
是一个cordova插件中的函数(回答这个问题不需要知道cordova),它返回一个对象{ isInitialized : true/false }
并将通过第一个if
- 语句我对isInitialized()
的来电将执行else
。
问题:
为什么第9行的this.is_initialized
在函数isInitialized
中创建了一个新属性,而第14行的this.is_initialized
使用is_initialized
中的属性Test()
? / p>
不应该使用Test()
内的属性或使用isInitialized()
内的(新)变量吗?
如果它只是'表现得像这样,我该怎么做才能解决它?
代码我跑了
var t = new Test();
var r = {obj:{isInitialized:'nope'}};
t.isInitialized(r);
// console.log( 'now: ' + JSON.stringify( this.is_initialized ) ); on line 8:
// now: {"obj":{"isInitialized":"false"}}
// console.log( ref ); on line 10:
// Object {isInitialized: false}
console.log(JSON.stringify(r));
// {"obj":{"isInitialized":"notyet"}}
console.log(JSON.stringify(t));
// {"is_initialized":{"obj":{"isInitialized":"notyet"}}}
刚刚发生的是:
t
。is_initialized
结构但具有不同值的对象。r
作为参数调用了函数。else
中的代码执行。isInitialized
作为回调的异步函数。is_initialized
和r
。isInitialized
并执行if
。this.is_initialized
的当前值,不知何故在第9行执行后得到this.is_initialized
。is_initialized
内创建一个名为isInitialized()
的新变量,同时我希望它在is_initialized
中设置Test()
,而不是创建一个在{功能已完成执行。this.is_initialized.obj.isInitialized
。Test.is_initialized
的初始值。is_initialized
的值仍然是初始值。信息:
如果你想自己测试一下,回答我的问题为什么?和我该怎么处理它?</ em>但需要{{1}的一些代码只是使用这个:
bluetoothle.isInitialized
我想感谢你阅读这个长期的问题。
答案 0 :(得分:0)
你在一个职能部门。在函数内部(除非它被声明为Test.prototype.isInitialized),&#39;这个&#39;的范围规则。是不同的。这是ES6旨在消除的陷阱之一。 (如果你添加&#34;使用strict&#34 ;;在函数的顶部,大多数浏览器会告诉你这个。)
在Test中声明var self = this并在内部函数中使用self,你应该得到你想要的结果。 @squint已经说过这个了。