首页IT科技作用域变量分为(作用域&变量提升&闭包题目及内容解答)

作用域变量分为(作用域&变量提升&闭包题目及内容解答)

时间2025-07-31 07:07:39分类IT科技浏览5571
导读:这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助...

这里给大家分享我在网上总结出来的一些知识                ,希望对大家有所帮助

这段代码的关键在于:var x = y = 1; 实际上这里是从右往左执行的                       ,首先执行y = 1, 因为y没有使用var声明        ,所以它是一个全局变量            ,然后第二步是将y赋值给x                       ,讲一个全局变量赋值给了一个局部变量            ,最终        ,x是一个局部变量                       ,y是一个全局变量               ,所以打印x是报错                。

2. 代码输出结果

var a, b (function () { console.log(a); console.log(b); var a = (b = 3); console.log(a); console.log(b); })() console.log(a); console.log(b);

输出结果:

undefined undefined 3 3 undefined 3

这个题目和上面题目考察的知识点类似    ,b赋值为3                        ,b此时是一个全局变量                   ,而将3赋值给a,a是一个局部变量                    ,所以最后打印的时候                       ,a仍旧是undefined                       。

3. 代码输出结果

var friendName = World; (function() { if (typeof friendName === undefined) { var friendName = Jack; console.log(Goodbye + friendName); } else { console.log(Hello + friendName); } })();

输出结果:Goodbye Jack

我们知道    ,在 JavaScript中                , Function 和 var 都会被提升(变量提升)                       ,所以上面的代码就相当于:

var name = World!; (function () { var name; if (typeof name === undefined) { name = Jack; console.log(Goodbye + name); } else { console.log(Hello + name); } })();

这样        ,答案就一目了然了        。

4. 代码输出结果

functionfn1(){ console.log(fn1) } varfn2 fn1() fn2() fn2=function() { console.log(fn2) } fn2()

输出结果:

fn1 Uncaught TypeError: fn2 is not a function fn2

这里也是在考察变量提升            ,关键在于第一个fn2()                       ,这时fn2仍是一个undefined的变量            ,所以会报错fn2不是一个函数            。

5. 代码输出结果

function a() { var temp = 10; function b() { console.log(temp); // 10 } b(); } a(); function a() { var temp = 10; b(); } function b() { console.log(temp); // 报错 Uncaught ReferenceError: temp is not defined } a();

在上面的两段代码中        ,第一段是可以正常输出                       ,这个应该没啥问题               ,关键在于第二段代码    ,它会报错Uncaught ReferenceError: temp is not defined                       。这时因为在b方法执行时                        ,temp 的值为undefined            。

6. 代码输出结果

var a=3; function c(){ alert(a); } (function(){ var a=4; c(); })();

js中变量的作用域链与定义时的环境有关                   ,与执行时无关        。执行环境只会改变this               、传递的参数                        、全局变量等

7. 代码输出问题

function fun(n, o) { console.log(o) return { fun: function(m){ return fun(m, n); } }; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1); c.fun(2); c.fun(3);

输出结果:

undefined 0 0 0 undefined 0 1 2 undefined 0 1 1

这是一道关于闭包的题目,对于fun方法                    ,调用之后返回的是一个对象                       。我们知道                       ,当调用函数的时候传入的实参比函数声明时指定的形参个数要少    ,剩下的形参都将设置为undefined值               。所以 console.log(o);会输出undefined    。而a就是是fun(0)返回的那个对象                        。也就是说                ,函数fun中参数 n 的值是0                       ,而返回的那个对象中        ,需要一个参数n            ,而这个对象的作用域中没有n                       ,它就继续沿着作用域向上一级的作用域中寻找n            ,最后在函数fun中找到了n        ,n的值是0                   。了解了这一点                       ,其他运算就很简单了               ,以此类推。

8. 代码输出结果

f = function() {return true;}; g = function() {return false;}; (function() { if (g() && [] == ![]) { f = function f() {return false;}; function g() {return true;} } })(); console.log(f());

输出结果: false

这里首先定义了两个变量f和g    ,我们知道变量是可以重新赋值的                    。后面是一个匿名自执行函数                        ,在 if 条件中调用了函数 g()                   ,由于在匿名函数中,又重新定义了函数g                    ,就覆盖了外部定义的变量g                       ,所以    ,这里调用的是内部函数 g 方法                ,返回为 true                       。第一个条件通过                       ,进入第二个条件    。

第二个条件是[] == ![]        ,先看 ![]             ,在 JavaScript 中                       ,当用于布尔运算时            ,比如在这里        ,对象的非空引用被视为 true                       ,空引用 null 则被视为 false                。由于这里不是一个 null, 而是一个没有元素的数组               ,所以 [] 被视为 true, 而 ![] 的结果就是 false 了                       。当一个布尔值参与到条件运算的时候    ,true 会被看作 1, 而 false 会被看作 0        。现在条件变成了 [] == 0 的问题了                        ,当一个对象参与条件比较的时候                   ,它会被求值,求值的结果是数组成为一个字符串                    ,[] 的结果就是                       ,而 会被当作 0     ,所以                ,条件成立            。

两个条件都成立                       ,所以会执行条件中的代码        , f 在定义是没有使用var            ,所以他是一个全局变量                       。因此                       ,这里会通过闭包访问到外部的变量 f, 重新赋值            ,现在执行 f 函数返回值已经成为 false 了            。而 g 则不会有这个问题        ,这里是一个函数内定义的 g                       ,不会影响到外部的 g 函数        。所以最后的结果就是 false                       。

如果对您有所帮助               ,欢迎您点个关注    ,我会定时更新技术文档                        ,大家一起讨论学习                   ,一起进步               。

声明:本站所有文章,如无特殊说明或标注                    ,均为本站原创发布    。任何个人或组织                       ,在未征得本站同意时    ,禁止复制        、盗用           、采集                        、发布本站内容到任何网站            、书籍等各类媒体平台                        。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理                   。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
parsepath vue 源码(【手撕源码】vue2.x中keep-alive源码解析) macbook 降级(macos monterey怎么降级系统?macos monterey降级系统教程)