2016-06-07 113 views
1

我正在測試一個非常簡單的代碼,並期望得到錯誤,但我得到了一個由控制檯返回的字符串「result」!JavaScript返回「結果」而不是錯誤或異常

下面是代碼:

var person = { name: "Mohammad", last_name: "Kermani"}; 

var show_person = function (age){ 
    console.log(this.name +" is "+ age + " years old"); 
} 

現在,你現在不能用this.name JavaScript時不知道什麼this(對象),那麼我們就需要使用callapply

現在,當我寫這個,我得到了「結果」的字符串(而不是錯誤或者警告)

show_person(20); //Returns: result is 20 years old 

Jsfiddle什麼控制檯的回報。

call的代碼應該是這樣的:

show_person.call(person, 20); //Returns: Mohammad is 20 years old 

什麼是字符串「結果」和爲什麼要使用JavaScript時,它不必this.name訪問不返回錯誤?

如果我們不在函數中使用某個對象並想要獲得它的某個屬性會發生什麼?(喜歡這裏,我希望得到的人對象的名稱)

+0

可能出現[This「關鍵字的工作方式?](http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Andreas

+0

表達式'show_person (20); '在鉻是20歲。 – viveksinghggits

回答

4

在這種情況下,this指全球window對象。並且window.name在jsFiddle上是"result",因爲它是結果框架。

+0

謝謝,這是否意味着當我不告訴JavaScript「這是你應該使用的對象」它會使用窗口對象? – M98

+1

在Web瀏覽器中,在頁面加載時,'this'總是指向全局'window'對象。這就是爲什麼您可以訪問例如'setTimeout()'函數或'sessionStorage'等。 – meskobalazs

+0

窗口是根文檔模型OBJECT。一切都休息在窗口內。把它看作瀏覽器的窗口,你的所有Web項目都在這裏。 –

1

Javascript完全知道這是指什麼。只要你的函數沒有包含在某個特定的環境中,這個引用將指向全局對象窗口

+0

'this'的值主要取決於函數的調用方式,而不是定義的位置。我不明白你的意思*「只要你的功能沒有包含在特定的環境中」*。 –

+0

駐留在環境中意味着它位於全局名稱空間中,而不是任何特定的名稱空間中。所以,JS中的全局命名空間就是窗口。我不認爲我說過某些不明確的 –

+0

在'function foo(){function bar(){console.log(this); } bar(); }','this'也會指向'window',即使'bar'不是全局的。但是,也許這不是你的意思,我誤解了你? –

0

這裏是代碼工作一塊做你想要達到的:

function PersonShower(){ 
    this.person = { name: "Mohammad", last_name: "Kermani"}; 

} 
PersonShower.prototype.show_person = function (age){ 
    console.log(this.person.name +" is "+ age + " years old"); 
} 
var p = new PersonShower(); 
p.show_person(20); 

的PersonShower現在是與人屬性(它可以作爲一個構造函數參數傳遞)的對象 然後,show_person方法是爲對象原型定義的。

這樣,使用這個指的是PersoShower實例。

https://jsfiddle.net/57t9sadr/4/

希望它可以幫助

1

您可能正在尋找這樣的事情:

function Person (opt) { 
    this.name = opt.name; 
    this.lastName = opt.lastName; 
    this.age = opt.age; 
} 

Person.prototype.showPerson = function() { 
    console.log(this.name, 'is', this.age, 'old'); 
} 

var muhammed = new Person({ 
    name: 'Muhammed', 
    lastName: 'Kermani', 
    age: 20 
}); 

console.log(muhammed.showPerson()); 
console.log(muhammed.name); 
console.log(muhammed.lastName); 
+0

不,我沒有。我只是不知道爲什麼「結果」正在退出。謝謝 – M98

+0

沒問題。這個問題已經得到解答,所以這只是爲了展示一個正確的'this'上下文的例子。使用呼叫,在您的示例中應用或綁定是一個不必要的解決方法... – Rudi

+0

謝謝。這有助於我瞭解更多 – M98

0

window.name是用來識別窗口對象預留的參考。通常用於識別數據傳輸的幀。

JSFiddle使用框架名爲結果您從中獲得該參考。 相比之下,JSBin使用「JS Bin Output」作爲window.name

默認情況下,它將是一個空字符串。這就是爲什麼在大多數瀏覽器中window.name是一個空字符串,與其他未定義的屬性相比,這將是一個異常。

You can learn more about window.name on MDN.

我可以看到你似乎明白詞彙範圍。讓我知道你是否想讓我解釋綁定和詞法範圍是如何工作的。