在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';
};
});
我错过了什么吗?角度执行是最好的做法吗?
答案 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 () {};
将无法运行。