Принесите новую функцию в замыкание

1

Я много читал о закрытиях, и я регулярно их использую, но я нашел случай, который я не понимаю. Почему не доступна переменная hello для моей функции, которую я прохожу для тестирования? Разве это не должно найти его, поскольку оно просматривает изменение сферы? Мой код:

(function($){
    var hello="hello world"
    $.test=function(a){
        alert(hello+" 1")
        a()}
})(this)
test(function(){alert(hello+" 2")})
  • 2
    Вы, вероятно, ожидаете динамическую область видимости (наследуя от вызывающей стороны), но Javascript имеет лексическую область видимости (наследуется как написано)
  • 0
    пожалуйста, не добавляйте "решено" в заголовке, зеленая галочка в ответе указывает, что вы нашли решение
Показать ещё 1 комментарий
Теги:
scope
function
closures

1 ответ

6
Лучший ответ

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() принимает аргумент, который предоставляет данные, над которыми он будет работать.

  • 0
    Спасибо, я приму но это говорит, что я прибавил в весе 5 минут

Ещё вопросы

Сообщество Overcoder
Наверх
Меню