2017-01-18 7 views
0

В хромированной консоли Developement, Я создал функцию F с двумя более поместить его функцииJavascript: почему я могу получить доступ к внутреннему имени, объявленному внутри функции в глобальной области?

> var a = 'ga'; 
    var b = 'gb'; 
    var c = 'gc'; 
    var f = function(){ 
     var a = 'fa'; 
     var b = 'fb'; 
     ff = function(){ 
      var a = 'ffa'; 
      fff = function(){ 
       console.log("a,b,c is: " + a + "," + b + "," + c); 
      }; 
      fff(); 
     }; 
     ff(); 
    }; 
< undefined 

Затем я вход ff на консоль, обнаружил, что все еще может получить к нему доступ, в то время как он был определен во внутреннем объеме из f

> ff  // why can I still access the name ff ? 
< function(){ 
     var a = 'ffa'; 
     fff = function(){ 
      console.log("a,b,c is: " + a + "," + b + "," + c); 
     }; 
     fff(); 
    } 

И так происходит название fff

> fff // why can I still access the name fff ? 
< function(){ 
      console.log("a,b,c is: " + a + "," + b + "," + c); 
     } 

Я разработчик C/C++ и в настоящее время перебираю javascript.

Этот феномен кажется сложным для меня, чтобы понять.
Потому что в Cpp ошибка доступа к имени внутри внутренней области.
, например:

#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]){ 
    auto f = [](){ 
     std::cout << "in f() now" << std::endl; 
     auto ff = [](){ 
      std::cout << "in ff() now" << std::endl; 
      auto fff = [](){ 
       std::cout << "in fff() now" << std::endl; 
      }; 
      fff(); 
     }; 
     ff(); 
    }; 

    f(); //it's okay 
    ff(); // not okay, error: use of undeclared identifier 'ff' 
    fff(); // not okay too, error: use of undeclared identifier 'fff' 

    return 0; 
} 

И даже в питона, мы не можем сделать это тоже:

def f(): 
    print("in f() now") 
    def ff(): 
     print("in ff() now") 
     def fff(): 
      print("in fff() now") 
     fff() 
    ff() 

f() # okay 
ff() # NameError: name 'ff' is not defined 
fff() # NameError: name 'fff' is not defined 

Итак, я wonderring почему можно доступ к имени в внутренней сферы даже если я вне этого?

Заранее благодарен!

+2

Поскольку JS был разработан таким образом. Без объявления с использованием 'var' /' const'/'let', он присваивает глобальную переменную. – alex

ответ

3

Вы не использовали var объявить ff или fff. Если вы их не объявляете, они автоматически объявляются глобально, а не локально.

Так что я не пробовал, но это должно вести себя как то, что вы после ...

var a = 'ga'; 
    var b = 'gb'; 
    var c = 'gc'; 
    var f = function(){ 
     var a = 'fa'; 
     var b = 'fb'; 
     var ff = function(){ 
      var a = 'ffa'; 
      var fff = function(){ 
       console.log("a,b,c is: " + a + "," + b + "," + c); 
      }; 
      fff(); 
     }; 
     ff(); 
    }; 
+0

Извините, меня заставили ждать 3 минуты. –

5

Переменные без var создаются в глобальном контексте.

Присвоение значения необъявленной переменной неявно создает его как глобальную переменную (она становится свойством глобального объекта) при выполнении назначения.

+1

известный пример 'for (i = 0; i <...'. –

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

  • Нет связанных вопросов^_^