2013-07-02 2 views
-2

Я хочу, чтобы достичь чего-то похожее на это:контекст функции в JavaScript

Функция someFunction имеет метод .lockThis(<object>) и когда первая называется:

var foreverThis = {}; 

someFunction.lockThis(foreverThis); 

// ... or 
// someFunction = someFunction.lockThis(foreverThis); 

Он будет связывать эту функцию в <object>, так что следующее (или любое другое) время, когда эта функция выполняется с помощью функции as-function или as-method, или с помощью apply/call - изначально это дало <object>.

Я могу, конечно, определить Function.prototype.lockThis который будет вызывать функцию с помощью .apply()/call() и указать данный объект в качестве контекста, но он по-прежнему можно будет заменить контекст someFunction, если кто-то называет его через apply(), а также.

Есть ли способ, чтобы заблокировать контекст функции в JavaScript таким образом, что он будет всегда предоставили объект как this без изменения кода самой функции?

+0

Так что вы на самом деле пытаются сделать это так, что если вы 'someFunction.lockThis (что-то)', каждый раз, когда вы называете 'someFunction' независимо от того, где в код, он будет притворяться, что это делает что-то .someFunction'? –

+0

@SamuelReid, да, что-то вроде этого – mishik

+0

В вашем удаленном вопросе: '$ (". Class3 ")' выбирает все элементы, которые имеют класс 'class3'; '$ (" div.class3 ")' выбирает все элементы, которые имеют класс 'class3' ** и ** являются элементами' div'. И все это позволяет себе, что современные браузеры поддерживают индекс отношения классов к элементам, и простой селектор классов может быть запрошен с помощью 'getElementsByClassName', в то время как другой требует' querySelectorAll' или 'getElementsByClassName' + фильтрации по' tagName'. [Ссылка] (http://api.jquery.com/class-selector/) –

ответ

1

Это называется bind():

someFunction = someFunction.bind(foreverThis); 
+0

Да, но если после 'bind()' я запустил 'someFunction.apply (evilContext)', у него будет другое 'this'. – mishik

+0

@mishik: Неправильно. – SLaks

+0

@mishik 'bind' эффективно создает замыкание вокруг функции и сохраняет предоставленный контекст для использования при вызове функции позже; поэтому применяются вызовы, которые закрывают оболочку (однако движок ее реализует), но не влияет на то, как замыкание вызывает завернутую функцию, используя ранее сохраненный контекст. – user2246674

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