Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript自定义对象:函数的上下文_Javascript_Function_This - Fatal编程技术网

JavaScript自定义对象:函数的上下文

JavaScript自定义对象:函数的上下文,javascript,function,this,Javascript,Function,This,我对JavaScript没有深入的了解,我将改变这种情况。但是JavaScript自定义对象函数作用域的某些逻辑对我来说没有任何意义 例如:它是默认项目模板(适用于Windows Phone 7)中PhoneGap代码的一部分 它使用对象文字来创建app对象。我发现initialize和bindEvents函数在app对象范围内运行。但是什么是OnDevicerady的范围 我试图在onDeviceReady中编写下一个代码: console.log(this == document);\\ou

我对JavaScript没有深入的了解,我将改变这种情况。但是JavaScript自定义对象函数作用域的某些逻辑对我来说没有任何意义

例如:它是默认项目模板(适用于Windows Phone 7)中PhoneGap代码的一部分

它使用对象文字来创建
app
对象。我发现
initialize
bindEvents
函数在
app
对象范围内运行。但是什么是OnDevicerady的范围

我试图在onDeviceReady中编写下一个代码:

console.log(this == document);\\out: false

你的问题发生在这里:

document.addEventListener('deviceready', this.onDeviceReady, false);
当事件发射器调用方法
ondevicerady
时,它将上下文设置为
document
,因为侦听器绑定到该上下文

您可以使用以下方法修复它:

document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
或支持旧浏览器的解决方案:

var self = this;
document.addEventListener('deviceready', function() {
    self.onDeviceReady.apply(self, arguments);
}, false);

如果使用工具库下划线,则可以使用跨浏览器:


谈到JavaScript时,您使用的“范围”一词确实不准确。函数的“作用域”与通过属性值与其关联的任何对象无关。我想你说的是上下文,这取决于函数的调用方式。如果您将
console.log()
调用更改为仅输出
,您将得到您的答案。@Pointy的可能重复项我做了,并得到下一行-
System.Collections.Generic.Dictionary的2[System.String,System.Object]
很遗憾,我不清楚。@Pointy您是对的,
context
更适合这个词。我知道在“ondevicerady”中是另一个上下文,我知道如何绑定
this
,但在我的情况下,我无法得到this是什么?因为
console.log(this==文档)\\输出:false
var self = this;
document.addEventListener('deviceready', function() {
    self.onDeviceReady.apply(self, arguments);
}, false);
document.addEventListener('deviceready', _.bind(this.onDeviceReady.bind, this), false);