2016-07-16 47 views
1
var teamName ="studio"; 
var otherTeamName ={ 
    teamName :'factory', 
    getTeamName : function(){ 
     alert(this.teamName); 
    } 
}; 
window.otherTeamName.getTeamName();// alerts factory 

有沒有什麼辦法讓studio?通過使用相同的getTeamName功能(即我知道,刪除this將取工作室。)而不刪除這個?的Javascript:我們可以重用內部函數來存取權限全局和局部

+0

,你可以嘗試使用二傳手.. – Tal87

+2

您的問題不使很多感覺! – undefined

回答

1

是的,這是可能的。有兩種方法:

  1. 使用callotherTeamName.getTeamName.call(window)
  2. 拷貝參考:

    var getTeamName = otherTeamName.getTeamName; 
    getTeamName(); // alerts studio 
    

call()不被舊版本瀏覽器的支持,第二個解決方案作品無處不在。

var teamName = "studio"; 
 

 
var otherTeamName = { 
 
    teamName: 'factory', 
 
    getTeamName: function() { 
 
     alert(this.teamName); 
 
    } 
 
}; 
 
otherTeamName.getTeamName(); // alerts factory 
 

 
var getTeamName = otherTeamName.getTeamName; 
 
getTeamName(); // alerts studio

+0

第二種選擇很好。只有一條評論:呼叫得到了很好的支持,我認爲談論支持呼籲是沒有意義的。 – dfsq

0

簡答:不是。它不是對象的屬性,所以你不能像訪問它一樣。

較長的答案:您可以將teamName屬性替換爲返回變量值的getter function ...但這對任何問題都是不直觀的方法。

1

是的,你仍然可以使用,通過改變上下文功能相同getTeamName方法執行:

var teamName = "studio"; 
 
var otherTeamName = { 
 
    teamName: 'factory', 
 
    getTeamName: function() { 
 
     alert(this.teamName); 
 
    } 
 
}; 
 

 
otherTeamName.getTeamName.call(window);

使用Function.prototype.call你讓thiswindow,而不是 otherTeamName對象。

UPD。但是,這隻有在teamName是全局變量時纔有效。如果沒有,請檢查Quentin的答案。

+0

而當代碼片段不在全局範圍內時,它將不起作用。 – undefined

+0

@Vohuman是的,你說得對,是OP要意識到的東西。 – dfsq

0

您可以簡單地使用

otherTeamName.getTeamName.call(this) 

這這裏指的是窗口

0
// The good: 
otherTeamName.getTeamName.call(this); 
otherTeamName.getTeamName.apply(this); 

// The okayish: 
var f = otherTeamName.getTeamName; f(); 
otherTeamName.getTeamName.bind(this)(); 

// The bad: 
((f) => f)(otherTeamName.getTeamName)(); 
(function(f) {f()})(otherTeamName.getTeamName) 

// The ugly: 
eval(otherTeamName.getTeamName)(); 
eval("(" + otherTeamName.getTeamName + ")()"); 
new Function("(" + otherTeamName.getTeamName + ")()")(); 
相關問題