2010-05-05 35 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

相關問題