为什么AngularJS控制器范围不像常规javascript范围那样工作?

时间:2014-02-10 18:51:24

标签: javascript angularjs

vanilla javascript我能做到:

run();
function run() {};

在角度上虽然看起来我必须预定义范围上的所有函数才能运行它们:

app.controller('MainCtrl', function($scope) {
  $scope.fxn = function() {
    $scope.status = 'working';
  };
  $scope.fxn();
});

因为这会引发错误TypeError: Object #<Object> has no method 'fxn'

app.controller('MainCtrl', function($scope) {
  $scope.fxn();
  $scope.fxn = function() {
    $scope.status = 'working';
  };
});

我错过了什么吗?角度执行是最好的做法吗?

2 个答案:

答案 0 :(得分:4)

$ scope是一个有角度的对象。

在vanilla js中,你做不到:

var x = {};
x.alert("hi");
x.alert = function(msg) { alert(msg); }

当你这样做时

run();
function run() {};

你正在进行功能提升,这是所有功能定义被“提升”到顶部的地方,所以它就像你有

一样
function run() {};
run();

如果你做了,另一方面:

run(); //TypeError: undefined is not a function
otherrun(); //ReferenceError: otherrun is not defined
var run = function() {}

差异,再次悬挂,这次是可变升降。该代码相当于:

var run;
run(); //TypeError: undefined is not a function
otherrun(); //ReferenceError: otherrun is not defined
run = function() {}

变量的声明(但不是赋值)被提升到顶部。

一开始这一切都让人很困惑,但是如果你谷歌javascript提升并阅读一些文章,你应该对它的工作方式有一个很好的感觉。

答案 1 :(得分:1)

区别在于函数语句和函数表达式。函数语句就像它们被提升到当前范围的顶部一样。函数表达式不是。所以

run();
function run() {}

相当于

function run() {};
run();

然而,

run();
var run = function () {};

等同于

var run = function () {};
run();

相反,它等同于

var run;
run();
run = function () {};

将无法运行。