Я много читал о закрытиях, и я регулярно их использую, но я нашел случай, который я не понимаю. Почему не доступна переменная hello для моей функции, которую я прохожу для тестирования? Разве это не должно найти его, поскольку оно просматривает изменение сферы? Мой код:
(function($){
var hello="hello world"
$.test=function(a){
alert(hello+" 1")
a()}
})(this)
test(function(){alert(hello+" 2")})
JavaScript использует лексический охват (наконечник шляпы, чтобы уничтожить). Область определяется тем, где функция определяется не тем, где она передается, или откуда она вызывается.
Если вы хотите, чтобы функция имела доступ к данным в переменной из области, к которой она передана, вам необходимо определить ее, чтобы она приняла аргумент, а затем вам нужно передать данные.
"use strict";
(function($) {
var hello = "hello world"
$.test = function(a) {
alert(hello + " 1")
a(hello);
}
})(this);
test(function(passed_data) {
alert(passed_data + " 2")
});
Это общий шаблон проектирования. См. API Promise, например:
myFirstPromise.then((successMessage) => { // successMessage is whatever we passed in the resolve(...) function above. // It doesn't have to be a string, but if it is only a succeed message, it probably will be. console.log("Yay! " + successMessage); });
Обратите внимание, как переданная функция then()
принимает аргумент, который предоставляет данные, над которыми он будет работать.