angular中,在controller里定义对象,var xx和$scope.xx的区别

如果一个对象不需要在页面中用到,

直接用var xx;

那么该对象的作用域有多大


9.25补充

先上代码:

app.controller('MainCtrl', function($scope) {
    $scope.name = "x";
    var name1 = 'xx';
    $scope.foo = function() {
        var name2 = 'xxx';
        console.log(name1);
        console.log(name2);
    };
});

$scope定义范围基本上明白了
那么name2范围呢?在foo这个函数内?
name1的范围呢?

阅读 11.8k
5 个回答

我的简单理解是,而var定义的变量,仅仅是当前作用域。

$scope是被「输出」的,比到view中,到watcher中。

(问题其实有点问题,$scope.xx不是变量。)

$scope 是AngularJS自动帮你创建的对象,主要用于数据双向绑定,他的作用域是在controller或者directive控制的模板区域,简单理解是某个模板区域的数据绑定上下文,你自己通过var定义的变量作用域在当前函数内部,和$scope不是一个级别的东西,也就无所谓区别了。

Scope的定义大致如下(极简版):

// Generated by CoffeeScript 1.7.1
(function() {
  var Scope;

  Scope = (function() {
    function Scope() {
      this.$$watchers = [];
    }

    Scope.prototype.$watch = function(watcher, listener) {
      return this.$$watchers.push({
        watchFn: watcher,
        listenrFn: listener
      });
    };

    Scope.prototype.$digest = function() {
      return this.$$wathcers.forEach(function(watcher) {
        return watcher.watchFn();
      });
    };

    return Scope;

  })();

}).call(this);

在Scope外定义的内容没法watch和digest。

——————————————————————————9.25补充

楼主后来问的问题就跟angular无关了,属于变量作用域的问题。匿名函数内的定义的变量只在该函数内起作用。

详情请戳http://octsky.com/post/63/

变量作用域参照 js 规范说明, var 和 $scope 区别,主要就是 $scope 上的变量能被一些 watcher 检测到变化,如果有的话。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题