2010-05-05 26 views
3
// JavaScript JSON 
var myCode = 
{ 
    message : "Hello World", 

    helloWorld : function() 
    { 
    alert(this.message); 
    } 
}; 
myCode.helloWorld(); 

上面的JavaScript代码会提醒'undefined'。当使用JSON定义的函数时,是否可以使用相对语法来访问JSON属性?

,使之成为真正的代码工作将需要如下所示...(注意myCode.message字面路径)

// JavaScript JSON 
var myCode = 
{ 
    message : "Hello World", 

    helloWorld : function() 
    { 
    alert(myCode.message); 
    } 
}; 
myCode.helloWorld(); 

我的问题是...如果我使用申报功能json以这种方式,是否有一些“相对”的方式来访问myCode.message,或者只有使用文字命名空间路径myCode.message才能这样做?

+0

'上面的JavaScript代码会提醒“未定义”。 'IT RETURNS'Hello World''not undefined' – vijay 2016-11-28 20:38:42

回答

6

你的第一个例子中工作时,helloWorld函数内部的this值将参照myCode对象本身,因为你调用它通过myCode.helloWorld();

当你调用一个函数是一个对象的成员,这个对象将是设置为该函数的值this

在这种情况下,myCodemyCode.helloWorld参考的基本对象

还有两个案件有关this关键字是如何隐含,例如,当你调用未绑定任何对象的属性的函数,即:内部

myFunc(); 

thismyFunc将指向全局对象。

当您使用new操作:

var obj = new MyFunc(); 

MyFuncthis值指的是新创建的对象。

而且你可以明确地设置功能的this值,使用callapply

function test() { 
    return this + " World"; 
} 
test.call("Hello"); // "Hello World" 

刚一说明,这不是JSON,JSON是一个简单的数据交换格式,它的语法与不同例如:JavaScript Object Literal syntax

{ foo: "bar" } 

以上是有效的JavaScript对象字面值,但不是t有效的JSON,JSON要求将属性标识符用引号括起来,并且它允许有一组有限的数据类型,例如,不能将函数作为JSON对象的成员。

0

首先,这不是JSON。你在这里只是一个对象文字。 JSON是一种数据格式,不支持功能。

二,是否了解这个绑定的工作原理。

除非经由call()apply()显式绑定或实例化的对象的方法中内部使用,this总是指当前window对象。

由于您将myCode定义为对象字面值,因此“实例化对象”不适用。此外,您没有使用call()apply(),所以那些也不适用。因此,在第一个示例的代码中,this等于window,这就是您未定义的原因(因为window.message未定义)。

你已经知道一个解决方法 - 你的第二个代码片段。您的其他选择是实际继续并使用call()apply()

var myCode = 
{ 
    message : "Hello World", 

    helloWorld : function() 
    { 
    alert(this.message); 
    } 
}; 
myCode.helloWorld.call(myCode); 

这样,你基本上是告诉Javascript功能来使用myCode作为this和预期它会奏效。

另一种选择是使myCode可实例化。

var myCode = function() 
{ 
    this.message = 'Hello World'; 
    this.helloWorld = function() 
    { 
    alert(this.message); 
    } 
} 
var mc = new myCode(); 
mc.helloWorld(); 

+1

不,'this'仅在被调用的引用中没有*基对象*时引用全局对象,例如'myFunc();'。在他的例子中,基础对象是'myCode',它起作用,'myCode.helloWorld.call(myCode);'是多余的。 – CMS 2010-05-05 22:04:16

+1

什么CMS说.. – 2010-05-05 22:12:54

+0

这是我得到3啤酒后张贴。 Feliz Cinco de Mayo! – 2010-05-05 22:19:29

相关问题