2017-10-05 91 views
1

我想從一個獨立變量的特定對象中放入一個成員函數,希望能夠通過簡單地使用新變量來調用函數(在原始對象上)。Javascript - 將對象的成員函數放入獨立變量中?

因此,像這樣:

var str = "abcdefgh"; 
var fn = str.indexOf; 
console.log(fn("e")); // supposed to output 4 

所以fn(x)應該做的事一樣str.indexOf(x)。但這不起作用。還有另一種方法可以解決這個問題嗎?

請注意,這裏的難點是我想fn在該特定的str對象上調用函數。 因此fn是成爲某種封閉。

回答

2

You Don't Know JS Series,JS決定以這種方式

  1. this被調用,新(新的結合)的功能?如果是這樣,這是新構建的對象。

    var bar = new foo()

  2. 調用的函數調用帶或應用(顯式綁定),甚至 隱藏綁定硬約束力裏面?如果是這樣,這是明確的 指定的對象。

    var bar = foo.call(obj2)

  3. 是帶一個上下文(隱式綁定)的功能,否則 稱爲擁有或含有對象?如果是這樣,這是上下文 對象。

    var bar = obj1.foo()

  4. 否則,默認情況下,這個(默認綁定)。如果在嚴格模式下, 選擇未定義,否則選擇全局對象。

    var bar = foo()

你的問題

當你調用indexOfstr.indexOf('e'),JS引擎開始查找在函數的上下文。它看到你已經用一個字符串對象的.表示法調用該函數,並將該上下文引用它。但 當你獲得該函數的參考並嘗試調用像fn時,引擎開始搜索上下文(上面提到的),但沒有找到任何內容。否則,當你在外面得到一個函數引用時,就會失去它的上下文。所以你需要明確地給出上下文。

在這裏我寫道,無論何時調用fn,函數內部的this都會引用str變量。

var str = "abcdefgh"; 
 
var fn = str.indexOf.bind(str); 
 
console.log(fn("e")); // supposed to output 4

1

如果您正在使用ES6各種JavaScript中,你可以使用一個 「箭頭函數」 來實現這一目標。這是一個很好的簡短語法。

爲了進一步參考, see the mozilla docs on arrow functions

此變量當然可以圍繞通過。請注意,通過此解決方案,變量fn擁有對正在執行函數的字符串的直接引用,因此它解決了上下文問題。

+0

不錯!出於兼容性原因,我更喜歡上面的'bind()'方法,但這是一個很好的選擇。謝謝! – RocketNuts