【问题标题】:Closure inside Angular controllerAngular 控制器内部的闭包
【发布时间】:2015-11-10 01:00:51
【问题描述】:

伙计们。

我正在学习 AngularJS,我想知道为什么控制器内的函数不能像 clojure 一样工作。这是一个关于闭包如何工作的经典示例

var inner;

var outer = function(x) {
    inner = function() {
        console.log(x);
    }
}

outer(3);

inner();

所以,我希望这段代码会有类似的行为

angular.module('MyModule')
.value('x', 3)
.controller('MyCtrl', function($scope, x) {
        $scope.showMeX = function() {
           alert(x);
        }
    }
});

然而,无法从“showMeX”函数内部访问注入的变量“x”。为什么不?

我可以猜测 Angular 提供对 $scope 对象的访问只是为了避免弄乱 $scope 外部的某些对象,并且按照该逻辑,此类对象应该是“不可见的”。不过,目前我不明白这是如何工作的。

有什么想法吗?链接到一些要阅读的澄清内容将是完美的。

【问题讨论】:

  • 似乎工作正常jsfiddle.net/ab537s7v。你有错误吗?
  • 哦,我的错,我从我的代码中复制粘贴它而没有尝试小提琴。感谢您的回复,这确实有效,一切都按预期进行。我现在应该删除我的问题吗,保留它是没有意义的,对吧?
  • 好吧,你可以发布一个答案来解释发生了什么,只要你最后做对了,犯一些错误是可以的。 :)

标签: javascript angularjs


【解决方案1】:

这可能是一种错觉。 JavaScript 闭包是为此而设计的,使用上面发布的代码,您将永远不会得到xReferenceError。这并不意味着x 不能是undefined

【讨论】:

  • 是的,@pablochan 向我展示了真相 :) 下次我会小心的。从道德角度来看...我应该将您的答案标记为正确,还是我应该自己回答并说我错了?
  • 随心所欲,我的回答至少没有害处,但并没有具体描述你错在哪里。我建议你自己回答
猜你喜欢
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多