2017-03-24 92 views
0

我試圖從require d節點模塊調用具有特定this對象的方法。據我所知,有三種方法可以做到這一點,.bind(obj)(args),或.call(obj, arg1, ...),或.apply(obj, aryArgs)。我目前正在使用bind,但我已經嘗試了所有三個相同級別的不成功。爲什麼我的界限被忽略了?

這是我運行的呼叫:

var library = require("./library.js"); 

// ... 

requestHandler.bind(library)(req); 

requestHandler從這個文件中導出的status函數的引用:

exports.status =() => { 
    console.log(this); 
    this.render({text: "status ok"}); 
}; 

exports.paramSwitching =() => { 
    this.render("rendered via param switching"); 
}; 

exports.json =() => { 
    this.render({json: {this: 'renders', as: 'json'}}); 
}; 

exports.view =() => { 
    this.render({view: true, locals: {text: 'hi'}}); 
}; 

我想這個工作,使調用status函數時將library作爲其this對象,因爲這是定義render的地方。然而,console.log聲明顯示this作爲文件保存status的評價的內容,即

{ status: [Function], 
    paramSwitching: [Function], 
    json: [Function], 
    view: [Function] } 

這裏發生了什麼,以及如何解決這個問題? (或者,如果我不能,因爲Node有點奇怪,是否有解決方法?)

+0

請包括定義'requestHandler'的代碼,因爲它不是對出口中'.status'方法的引用,而是整個'exports'對象 – Pineda

+0

@Pineda:它已包含在內。仔細閱讀問題 – slebetman

+0

像往常一樣,每當有一個誤解'this',我會指出讀者對我這個問題的回答:http://stackoverflow.com/questions/13441307/how-does-the-this-keyword在JavaScript中的對象文字/ 13441628?s = 1 | 4.1585#13441628 – slebetman

回答

1

您的請求處理程序都被定義箭頭符號:

exports.status =() => { 
    console.log(this); 
    this.render({text: "status ok"}); 
}; 

在設計上的箭頭符號在函數聲明時捕捉this。這是幾乎一樣,如果你這樣做:

exports.status = (function(){ 
    console.log(this); 
    this.render({text: "status ok"}); 
}).bind(this); 

這意味着status()功能已經被綁定,不能反彈。解決辦法是停止使用箭頭功能:

exports.status = function(){ 
    console.log(this); 
    this.render({text: "status ok"}); 
}; 
1

箭頭函數本身已經將函數體函數中的this綁定到它定義的上下文的this中。你不能用這些方法中的任何一種來改變this

如果您需要更改this那麼您不能使用箭頭功能。

1

在我發佈這個問題後馬上找出來。我在包含status的文件中使用了箭頭函數,其中do not create their own this scope但使用封閉上下文。

調用bind,這些功能callapply沒有任何影響,因爲this已被設置爲函數的封閉情況下,在這種情況下是eval'd文件。

將常規功能(更改() =>改爲function())的箭頭功能切換已解決該問題。