Объект $ scope, используемый в методе без передачи

0

В следующем коде из этого примера:

<!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, но не передает ее явно?


Т.е. почему:

$scope.fullName = function() {

вместо

$scope.fullName = function($scope) {
  • 0
    $scope уже внедряется в вашу функцию controller .
  • 0
    Это очень основы JavaScript. Читайте о сферах и параметрах функций.
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню