2014-12-05 101 views
3

我有一段代碼,它接受fn作爲參數並將它存儲在object屬性中。fn.apply(fn,[])做什麼?

var obj = {}; 

function anotherFn(fn){ 
    obj["name"] = fn.apply(fn, []); 
} 

function google(){ 
    console.log("hello"); 
} 
anotherFn(google); 
console.log(obj.name); 

我不明白的是fn.apply(fn,[])代碼及其目的。通常當我們想在不同的this/context中執行fn時,我們使用callapply方法。

但是fn.apply(fn, [])在這裏做什麼?混亂是爲什麼我不能只是做

obj["name"] = fn(); 
+0

該調用**在不同的'this'上下文中執行'fn',這是函數對象本身。 – Pointy 2014-12-05 19:26:36

+0

我會建議在生產中不要做這樣的事情。 – tengbretson 2014-12-05 19:56:35

回答

6

fn.apply(fn, [])調用存儲在fn與上下文的fn(在執行功能的this值)的功能,幷包含在[](無參數)參數。

以這種方式撥打apply似乎很奇怪,因爲它本來就等於撥打fn.call(fn)

fn()是一個合適的替代品,如fn()將在全球範圍內執行,這意味着該函數內的this值將是window(假定一個瀏覽器環境)。

+0

這是正確的答案! – hurrtz 2014-12-05 19:26:25

+0

嗨。你能告訴我爲什麼在'obj.name'的控制檯上的輸出是'undefined',或者用'fn.apply(fn,[])'或者用'fn()'? – Verhaeren 2014-12-05 19:28:13

+0

@Verhaeren,請使用右上角的[Ask Question](http://stackoverflow.com/questions/ask)按鈕來提出新問題。 – zzzzBov 2014-12-05 19:31:59

2

這裏是展示它如何可以是不同的一個contrieved樣本:

var obj = {}; 

function anotherFn(fn){ 
    obj["name"] = fn.apply(fn, []); 
} 

function anotherFn2(fn){ 
    obj["name"] = fn(fn, []) 
} 

function google() { 
    console.log(this.world); 
} 
google.world = "yay!" 

anotherFn(google); 
anotherFn2(google); 

輸出是:

yay! 
undefined 

的jsfiddle:http://jsfiddle.net/c56ja3jL/

根據上下文,這可能是有用的。基本思想是你總是有this等於函數本身,而不是全局上下文。

+0

感謝您的回答朋友! – Shane 2014-12-05 19:40:23

+0

Shane! – 2014-12-05 19:43:57