scoping - 如果 JavaScript 是动态作用域,那么最后一个 console.log() 会在以下代码中产生什么结果?
问题描述
这就是我定义函数的方式,变量x,y,z
是用一些整数定义的。
var a = 0;
var x = 1;
var y = 2;
var z = 3;
function f(n) {
a = n;
}
function g(){
console.log(a);
}
function h(){
f(x); g();
}
function k() {
var a = 0; g(); f(y);
}
f(z); g(); k(); g(); h(); g();
以下是我对上面的代码是否为动态范围的想法:
f(z){
a = z; // The value of a became z
}
g(){
console.log(a); // Printing out the value of z
}
k(){
var a = 0;
g(){
console.log(a); // Printing out 0
}
f(y){
a = y; // Assign the value of y to the variable a initialized 5 lines above
}
}
g(){
console.log(a); // Printing out the value of z
}
h(){
f(x){
a = x;
}
g(){
console.log(a) // Printing out the value of x
}
}
g(){
console.log(a) // Printing out value of z or x ??
}
不确定最后一个 console.log 会输出什么。
解决方案
请参阅示例片段及其注释:
var a = 0;
var z = 1;
var x = 2;
var y = 4;
function f(n) {
a = n;
}
function g(){
console.log(`value of var a is ${a}`); // output var a value to console
}
function h(){
f(x); // a becomes 2 here since x = 2
g(); // output var a value to console
}
function k() {
var a = 0; // this sets a to 0 only in function scope
console.log(`function scope value of var a is ${a}`);
g(); // output var a value to console which is 1 here not 0
f(y); // a becomes 4 here since y = 4
}
f(z);
g();
k();
g();
h();
g();
console.log(`final value of var a is ${a}`);
下面的示例按您的意愿工作(如果我理解您的问题)。只需在函数中省略var
before 。
a
k()
var a = 0;
var z = 1;
var x = 2;
var y = 4;
function f(n) {
a = n;
}
function g(){
console.log(`value of var a is ${a}`); // output var a value to console
}
function h(){
f(x); // a becomes 2 here since x = 2
g(); // output var a value to console
}
function k() {
a = 0; // this sets a to 0 only in function scope
console.log(`function scope value of var a is ${a}`);
g(); // output var a value to console which is 1 here not 0
f(y); // a becomes 4 here since y = 4
}
f(z);
g();
k();
g();
h();
g();
console.log(`final value of var a is ${a}`);
推荐阅读
- algorithm - 在方法中找到描述递归的公式
- vb.net - 与类共享值并通过属性返回值
- redis - 当我运行“redis-server --service-start”时,出现错误代码 1056“启动服务失败:未知错误”
- python - ConfigParser 没有属性
- java - Spring Boot OIDC客户端开发通过VS代码不起作用
- android - AlarmManager 每 20 秒触发一次,而不是使用给定的时间间隔
- c++ - C++ 将字符从一个向量移动到另一个向量
- javascript - 无法为此模块构建类型化接口:createFragmentRef
- node.js - Requestlist 在 apify 中为超过 1000 万个 wordlist 抛出堆内存不足
- c++ - “std::string(*)[3][5][30]”类型的 C++ 参数与“std::string *”类型的参数不兼容