В хромированной консоли 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 почему можно доступ к имени в внутренней сферы даже если я вне этого?
Заранее благодарен!
Поскольку JS был разработан таким образом. Без объявления с использованием 'var' /' const'/'let', он присваивает глобальную переменную. – alex