2015-10-03 2 views
2

Для нижеприведенного фрагмента кода я ожидаю ответа как «число», но я получаю его как «неопределенный». Может ли кто-нибудь помочь мне здесь, чтобы узнать, почему его возвращение «не определено»?Доступ к свойствам объекта javascript в методе

var foo = { 
    bar: function() { 
     return this.baz; 
    }, 
    baz: 1 
}; 

(function() { 
    return typeof arguments[0](); //this will return "undefined" 
})(foo.bar); 

Если я сделать TYPEOF foo.bar(), то это даст мне ожидаемый ответ, как «число».

Заранее спасибо.

ответ

3

Это потому, что с нормальными функциями устанавливается как функция называется, а не там, где она определена. («Стрелка» функции ECMAScript2015 различны, они наследуют this от того, где они созданы, не так, как они называются.)

У вас есть несколько вариантов:

1) Используйте Function#bind для создания нового функция, которая при вызове будет вызывать оригинальную функцию с правильной this:

var foo = { 
 
    bar: function() { 
 
    return this.baz; 
 
    }, 
 
    baz: 1 
 
}; 
 
(function() { 
 
    snippet.log(typeof arguments[0]()); 
 
})(foo.bar.bind(foo));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

2) Используйте вас г собственная функция обертки:

var foo = { 
 
    bar: function() { 
 
    return this.baz; 
 
    }, 
 
    baz: 1 
 
}; 
 
(function() { 
 
    snippet.log(typeof arguments[0]()); 
 
})(function() { 
 
    return foo.bar.apply(foo, arguments); 
 
});
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+1

Я собирался ответить на тот же 'уаг Foo = { бар: функция() { console.log (это); return this.baz; } .bind (foo), baz: 1 }; (функция() { return typeof arguments [0](); } (foo.bar)); '. В любом случае +1 для приятного объяснения – Tushar

+0

Спасибо Кроудеру и Тушару. Но второй способ по-прежнему возвращает «неопределенный», не так ли? – Parashuram

+0

@Parashuram 'return foo.bar.apply (foo, arguments);' use 'foo' вместо' this' – Tushar

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