2016-07-31 92 views
0

在下面的代码this example

<!DOCTYPE html> 
<html> 
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
<body> 

<div ng-app="myApp" ng-controller="personCtrl"> 

First Name: <input type="text" ng-model="firstName"><br> 
Last Name: <input type="text" ng-model="lastName"><br> 
<br> 
Full Name: {{fullName()}} 

</div> 

<script> 
var app = angular.module('myApp', []); 
app.controller('personCtrl', function($scope) { 
    $scope.firstName = "John"; 
    $scope.lastName = "Doe"; 
    $scope.fullName = function() { 
     return $scope.firstName + " " + $scope.lastName; 
    }; 
}); 
</script> 

</body> 
</html> 

如何$scope.fullName被设置为使用$scope的功能,但并没有明确地传递了吗?


I.e.为什么:

$scope.fullName = function() { 

,而不是

$scope.fullName = function($scope) { 
+0

'$ scope'已经被注入你的'controller'函数。 – developer033

+0

这是javascript的基础知识。阅读关于范围和功能参数。 – dfsq

+0

^这。只有函数被参数调用(这里不是:'{{fullName()}}'),它必须是'function($ scope){}'。 '$ scope'不应该传递给这个函数,因为'$ scope'已经在父函数作用域中可用。如上所述,这些都是JS基础知识,它们并不特定于Angular。 – estus

回答

1

简短的回答: 因为全名()函数有过关闭它的父的范围是控制器功能。

长答案: JavaScript具有函数级范围,这意味着每个函数都创建它自己的范围。范围基本上是函数可以访问的变量和函数。当你在父函数中有子函数时,子函数有它自己的作用域,但也可以访问它的父函数的作用域。这被称为关闭 - 子功能有一个关闭超过父母的范围。一个函数不仅可以访问它的父级范围,但是它是祖父母的范围,并且一直沿着范围链。一个子函数有关闭超过它的父级范围,但不是相反。

请注意,注入角度控制器的$ scope变量与JavaScript中的作用域不同。我知道这让很多通过Angular学习JavaScript的人感到困惑。由于$ scope变量存在于控制器函数的作用域中,因此任何子函数都可以访问它。变量名称是$ scope的事实并没有改变实际发生的事情。

我真的掩饰了这一点,我建议阅读JavaScript中的范围和闭包。