Javascript 安格拉斯的生活

Javascript 安格拉斯的生活,javascript,angularjs,iife,Javascript,Angularjs,Iife,我在控制器中指定了如下函数: $scope.myFunction = function(){ console.log('test'); } <div ng-controller="MyCtrl as vm"> <select ng-options="vm.someOptions" ng-model="vm.someModel" ng-change="vm.myFunction()"></select> </

我在控制器中指定了如下函数:

$scope.myFunction = function(){ console.log('test'); }
<div ng-controller="MyCtrl as vm">
     <select ng-options="vm.someOptions" 
        ng-model="vm.someModel" 
        ng-change="vm.myFunction()"></select>
</div>
我希望在更改选择框时触发此功能。因此,我对select元素应用ng更改,如下所示:

 <select ng-options="..." ng-model="..." ng-change="myFunction();"></select>
但是,现在该功能仅在pageload上触发,而不是通过ng更改触发。 我注意到,当我更改括号时,函数也会被ng change触发:

($scope.myFunction = function(){ console.log('test'); })();
有人能解释为什么这很重要吗


非常感谢

这两者之间有很大的区别

($scope.myFunction = function(){ console.log('test'); }());
还有这个

($scope.myFunction = function(){ console.log('test'); })();
因为第一行分配函数调用的结果,然后只存储它,但它不是存储的函数

第二个函数按预期工作,因为您在将函数分配给
$scope.myFunction

更新


正如注释中指出的,第一行不是IIFE,因为您不是调用函数本身,而是调用函数的结果。

如果没有看到所有代码,很难判断。您没有使用IIFE,而是执行自己的函数并将其设置为$scope变量。此外,IIFE不会使其在页面加载时运行。与其尝试纠正所有这些问题,不如尝试使用更像下面示例的代码

尝试在iLife中创建控制器并更新HTML,如下所示:

$scope.myFunction = function(){ console.log('test'); }
<div ng-controller="MyCtrl as vm">
     <select ng-options="vm.someOptions" 
        ng-model="vm.someModel" 
        ng-change="vm.myFunction()"></select>
</div>

第一个调用不是IIFE,第二个是。@helper方法根据本文,两个版本都是IIFE,略有不同
,这样的参数通常表示将立即调用函数表达式,变量将包含函数的结果,而不是函数本身。这可以避免阅读您的代码的人需要向下滚动到很长的函数表达式的底部,以查看是否调用了它。
好的,我现在就知道了。我之所以选择前者,是因为JSLint抱怨函数的“错误调用”。