2013-08-27 57 views
4

我是一個比新手稍微多一點的JavaScript。不同的功能 - 它們是一樣的嗎?

在讀取源EventEmitter,我偶然發現了這個有趣的,對我來說,優雅的函數:

// alias a method while keeping the correct context 
function alias(name) { 
    return function aliasClosure() { 
     return this[name].apply(this, arguments); 
    }; 
} 

我有兩個主要問題:

首先:爲什麼是aliasClosure一個命名爲函數?除了清晰度之外,它在某些方面有用嗎?另外,真的是封閉?對我來說,它看起來就像一個半匿名函數。

:我改寫了這個函數是這樣的:

function alias2(name) { 
    return this[name].bind(this); 
} 

是否相同呢?我認爲它應該,因爲this上下文是相同的,它在兩個版本中都被保留。

是否有理由相對於另一個?

+0

查看第二個答案,這裏是一個很好的關閉封閉的JavaScript示例。 http://stackoverflow.com/questions/36636/what-is-a-closure – Matt

回答

1

在函數實例化表達式中提供一個名稱使得名稱可用於堆棧跟蹤。 (我聽說新的調試器並不總是需要它,如果在某些情況下創建功能,就像一個var初始化。)

我認爲第二個是等價的,大多是,雖然.bind()有它處理一些模糊的特殊情況。

編輯等待 - 不,它們不等同。第一個明確涉及this,並對每個調用執行查找。第一個函數不需要this在被調用時被綁定到任何東西,而在這種情況下你的將會拋出異常。

一個變化,這將使這兩個功能幾乎相同的包裝bind封閉內,像這樣:

function alias2(name) { 
    return function() { 
     return this[name].bind(this); 
    } 
} 

儘管如此,bind隱晦地在極少數情況下的行爲。

+0

嗨downvoter - 我只是更新了答案,因爲我改變了主意:) – Pointy

+0

好吧,夠公平。那麼第二個版本在某些情況下可能會出錯?我想是的,因爲它將'this'綁定到我稱之爲'alias2'的那一刻,然後它保持不變。 – whatyouhide

+0

@whatyouhide對 - 我剛加了一點。這是一種令人困惑的:) – Pointy

2

不,這些根本不等價。從看alias()功能,我認爲你會使用它是這樣的:

> Array.prototype.strjoin = alias('join'); // make 'strjoin' an alias of 'join' 
> [1, 2, 3].strjoin(" + "); 
"1 + 2 + 3" 

在上面的代碼中使用alias2()將無法​​正常工作。

+0

是的,@Pointy在上面回答了這個問題。不管怎樣,謝謝你! – whatyouhide

相關問題