分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

js中函数作用域,作用域链,变量提升

发布时间:2023-09-06 02:33责任编辑:沈小雨关键词:js作用域

先来分析几个容易出错的题目

第一题:

 ???????var foo = 1 ???????function bar(){ ???????????if(!foo){ ???????????????var foo = 10; ???????????} ???????????console.log(foo) ???????} ???????bar()

这道题大家会误认为是1

其实在内部函数执行时,无论这个判断是否成立,都会对声明变量进行提升,所以var foo = undefined,所以在内部判断,因为undefined是false,取反就是true,执行var foo = 10,所以:

最后答案就是10

第二题:

 ???????var n = 0 ???????function a(){ ???????????var n = 10 ???????????function b(){ ???????????????n++ ???????????????console.log(n) ???????????} ???????????b() ???????????return b ???????} ???????var c = a() ???????c() ???????console.log(n)

我直接叙述解题步骤了:

先声明变量,函数声明提前,执行a()函数,在a函数里又声明了函数b,调用函数b并且将b返回,n++将函数a里的n的值变为11,打印n,所以第一个n是11,

这时候将函数b返回,并且执行,因为这时还是在函数a内部执行,n已经是11,再n++,所以n = 12,

最后一个是n是0,函数的私有作用域无法访问

所以最终结果是11,12,0

第三题:

 ???????var a = 4 ???????function b(x,y,a){ ???????????console.log(a) ???????????arguments[2] = 10 ???????????console.log(a) ???????} ???????a = b(1,2,3) ???????console.log(a)

在js的非严格模式下:函数的实参集合与形参变量存在‘映射关系’,不管其中谁改变了,另外一个都会跟着改变

在js的严格模式下:arguments实参集合和形参变量的映射关系被切断了,相互之间互不干扰

如果没有返回值则是undefined

所以结果是3,10,undefined

js中函数作用域,作用域链,变量提升

原文地址:https://www.cnblogs.com/xufeng1994/p/10430274.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved