首页 > 编程知识 正文

4大作用域,函数作用域链

时间:2023-05-05 10:40:02 阅读:153986 作者:902

作用域作用域 : 就是变量和函数的可访问范围。

作用域有两种行为模式:词法作用域和动态作用域。 js采用词法作用域工作模式,词法作用域意味着编写代码时变量和函数声明的位置决定了作用域。

全局范围在脚本块中写入的代码在全局范围中声明的变量在代码块的顶部预定义,而作为全局对象window属性的最外层函数定义的变量具有全局范围。 这意味着您可以访问任何内部函数。

脚本var a=1; 函数fn () console.log ) a; (fn ); 在/script局部作用域(函数作用域)函数内部定义的变量被提升到函数代码块的顶级,不会成为全局对象window属性中的任何变量。 如果变量未声明就被赋值,则这些变量归全局对象所有。 script function fn () { var a=1; b=1console.log(a ); //return1console.log(b; //return 1,变量在未声明的情况下赋值,这些变量由全局对象所有。 函数内部没有b。 全球b } fn ); console.log(a ); //错误,不能从函数外部调用局部变量/script函数表达式。所有不是函数开头的都称为函数表达式2。 函数表达式中的函数名称没有意义,因为它会自动丢弃函数名称。 函数表达式可以用执行符号执行。 (4)在函数宣言之前加上某种运算符号,使之成为函数式。 例如: -!函数表达式不声明预scriptvarfn=new function { }/script函数参数。 基本数据类型: stringnumberbooleannullundefined是按值传递引用数据类型:object3360functionation的function fn () { var b=a; a; console.log(b ); (fn ); console.log(a ); /script称为“赋值”,将a的值传递给b,即使a发生了变化,b发生了变化,也不会影响其他值。 从上面可以看出,把a的值代入b后,进行自我增加,b的价值是a不会因为自我增加而变化

脚本var c=0; function fn () (functiona ) ) c; 返回c; (a ) var b=c console.log(b ) b; console.log(c ); (fn ); /script这里按地址传递,预编译时制作GO对象、属性c、值undefined的值为fn函数的fn属性; 然后,在fn执行之前,创建AO对象{a:afunction,b:undefined}。 在此,将c值代入b。 因为是函数对象,所以按地址传递。 预编译结束后,在a函数中,c值从0开始增加,最后输出b。 C值都是1。 与上述比较,比较容易看出差异,原因是c转发地址weAO对象内的c地址,所以无论c变更、b输出、c输出还是c输出,都是相同的值,与此相对,以以前的值转发的是a

作用域链掌管所有变量的使用顺序。 首先在本地查找,否则延长作用域在父作用域中查找[[scope]]:堆栈。 每个JavaScript函数都是对象。 有些对象可以访问,但有些属性不能访问。 这些属性只能由JavaScript引擎访问。 [[范围]]是其中之一,[[范围]]就是我们所说的范围,是存储执行上下文的集合范围链。 存储在“[范围]”中的运行时上下文对象的集合。 此集合是一个链连接,该链连接称为作用域链。 运行时上下文对象:执行函数时,将创建一个运行时上下文,该上下文定义函数运行的环境。 每次执行函数时,运行时上下文都是唯一的,因此每次调用函数时都会创建一个独立的运行时上下文,并在函数执行后立即丢弃。

脚本var c=0; function fn () { var c=1 function a ) ) { return c; (a ); var b=c; console.log(b ); //return 1 } fn (; 从/script全局作用域到函数fn作用域到函数a作用域形成作用域链,由自定义函数b接收由函数a传递的结果。 一般来说,查找函数内部是否没有自变量,是否存在与全局变量对应自变量,这是由多个函数嵌套的,由于函数a中没有c,所以从fn开始查找,有fn,在fn上输出变量c的值,如果没有fn,则轮到全局输出

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。