2016-07-31 3 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

^Это. Он должен быть 'function ($ scope) {}', только если функция вызывается с аргументом (и здесь это не: '{{fullName()}}'). И '$ scope' не следует передавать этой функции, потому что' $ scope' уже доступна в области родительских функций. Как сказано, это основы JS, они не являются специфическими для Angular. – estus

ответ

1

Короткий ответ: Поскольку FULLNAME() функция имеет закрытие над его сфера родителя, который является функцией контроллера.

Длинный ответ: JavaScript имеет область функционального уровня, которая означает, что каждая функция создает свою собственную область. Область действия - это в основном переменные и функции, к которым имеет доступ функция. Когда у вас есть дочерняя функция внутри родительской функции, дочерняя функция имеет свою собственную область действия, но также имеет доступ к области ее родительской функции. Это называется закрытием - дочерняя функция имеет закрытие над областью родителя. Функция имеет не только доступ к ее родительской сфере, но и область охвата бабушки и доходит до цепочки областей . У дочерней функции есть закрытие над его родительским охватом, но не наоборот.

Важно отметить, что переменная $ scope, введенная в угловые контроллеры, не такая же, как область видимости в JavaScript. Я знаю, что это смущает многих людей, которые изучают JavaScript через Angular. Поскольку переменная $ scope существует в области функции контроллера, любая дочерняя функция имеет к ней доступ. Тот факт, что имя переменной является $ scope, ничего не меняет о том, что происходит на самом деле.

Я действительно замалчиваю это, и я рекомендую читать информацию о масштабах и закрытиях в JavaScript.

Смежные вопросы