2012-05-02 2 views
1

Для следующего фрагмента кодаКогда оценивается «это»?

a.b = function c(){ 
    return function e(){ 
     return this; 
    }; 
}; 
d = a.b(); 

Что значение г() будет? Это может быть не очень хороший пример, но я просто смущен тем, о чем будет сказано это «это».

Спасибо,

+1

вы можете попробовать сделать console.log (это); внутри функции –

+0

Мое голосование будет «во время выполнения». – aroth

+0

Этот вопрос почти задавался столько раз, сколько раз анализировать HTML с регулярным выражением (lol). http://stackoverflow.com/questions/3320677/this-operator-in-javascript – Marty

ответ

4

Видя, как г теперь будет равняться FUNCTION, «это» будет оцениваться на то, что функция вызывает его. На самом деле это еще не оценено.

В конце исполнения, d='function e() { return this; }', так что в момент, когда вы выполняете d(), будет оценен this.

+2

Но в этом случае 'this' будет оцениваться' window' при вызове 'd()'. – bfavaretto

+0

Точно, WHEN 'd()' наконец оценивается, но вы правы. Причина этого в том, что все, что не является дочерним элементом объекта, является дочерним элементом окна, поэтому подумайте о 'd()' как 'window.d()', поэтому это относится к окну. – DanRedux

0

this - неявный параметр для всех функций.

См apply и call

Если вы знаете, питона, this точно так же как self, но явно не написано и всегда

0

Предполагая, что d() был вызван сразу же после того, как последняя строка вашего фрагмента d() вернет глобальный объект: window, если вы находитесь в браузере.

Однако оба они истинны:

d.call(a) === a; 
d.call(a.b.prototype) === a.b.prototype; 

который должен сказать, что this определяется тем, что передается в качестве первого аргумента call.

1

От вашего кода d не совпадает с «этим». d будет функция е, так как вы настраиваете d, чтобы быть возвращаемым значением вызова функции абы(), которая возвращает функцию, так

d = function e(){ 
    return this; 
} 

Теперь значение this зависит от того, как вы называете эту функция d , this будет оцениваться при вызове этой функции. Если вы просто назовете это d()this будет глобальным Window Объект.

и позволяет сказать, если у меня есть

obj ={foo:1, bar:2}; 

и зову, как это

d.call(obj) 

this будет объект OBJ. метод call() используется для вызова функции на любом объекте, переданный объект ведет себя как this внутри этой функции.

Я знаю Javascript, это действительно сбивает с толку, и вам нелегко обвести его вокруг. Возможно, это может помочь http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx

0

this - ссылка на объект, по которому был вызван метод. d() аналогичен window.d() (если нет with инструкция)

Смежные вопросы