您的位置:首页 > Web前端 > JavaScript

js 函数 作用域 全局作用域 局部作用域 闭包

2020-02-01 11:34 471 查看

一个变量没有声明但调用 直接报错,声明没有赋值会显示未定义。

作用域

作用域(scope):一条数据可以在哪个范围中使用。 通常来说,一段程序代码中所用到的数据并不总是有效/可用的,而限定这个数据的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。

变量(数据)js中,变量的作用域有两中,一种是全局作用域(全局变量) ,一种局部作用域(局部变量),一个变量是全局变量还是局部变量,主要看变量声明的位置。声明在函数内部,就是这个函数(function)的局部变量。(在js的ECMAScript5.1中只有函数才会产生作用域)?

全局作用域:---在任何地方都能访问, 函数外定义的变量拥有全局作用域 不使用var定义的变量拥有全局作用域。 所有window对象上的属性

function fn(){

window.nub = 100;

}

fn();

alert(nub);

加在window上边的内容作用域 属于全局的,属于window的属性,可以不用写window,直接写属性名就行 / / function fn(){ nub = 100; } fn(); alert(nub);

变量如果不加声明,就默认认为是window的内容,作用域变成全局了

1 加在window上的内容作用域属于全局的。 属于window的属性,可以不用写window,直接写属性名即可

2 变量若不加声明,就默认为window的内容,作用域变成全局。

3 没有声明在如何函数内部的变量(全局),就是全局变量在全局的任何地方就可以调用和修改,尽量不要使用全局变量,会早成全局污染 全局命名空间污染 在程序中经常需要引用一些库,如C 编译系统提供的标准库、由第三方软件开发商提供的开发库或者用户自己开发的库等。如果在这些库中含有与程序中定义的全局实体同名的实体,或者不同的库之间有同名的实体,则在编译时都会出现名字冲突,这就称为全局命名空间污染 (命名冲突)

全局作用域 --- 在任何地方都能访问 函数外定义的变量拥有全局作用域 不使用var定义的变量拥有全局作用域 所有window对象上的属性拥有全局作用域 没有声明在任何函数内部的函数拥有全局作用域 局部作用域 --- 只能在函数内部访问 使用var在函数内部定义的变量,和使用function在函数内部声明的函数,拥有局部作用域

域解析

域解析:浏览器每读到一个script标签,先不执行任何代码会先把这个代码快速的浏览一遍,然后从中挑出 var和 function 两个关键字。

var: 域解析遇到 var就把var连同它后边的名字一块提到所在的script(或function)的最前面,域解析完成之后,在从上往下一行一行执行代码,如果遇见就= 赋值

function: 预解析遇到function,就把整个函数提到script(或function)的最前面。(跟在var的后边预解析先解析var 在解析 function)function的优先级高于var

作用域链

[[Scopes]] : 作用域 当我们声明一个函数的时候,同时该函数就会创建一个属性这个属性是[Scopes],我们在这个函数中 声明的变量都会被存入这个函数的[[Scopes]]属性中 变量与函数的查找规则: 当我们调用一条数据的时候,js首先会在当前作用域中进行查找,如果找不到,就向上找到父级的作用域,如果在父级的作用域中也找不到,就继续向上查找,直到window的作用域。如果在window中也找不到,就报错了

闭包

里面可以访问外边的,但是外边不能访问里边的。 闭包: 形式函数中套了一个函数,内层函数可以访问外层函数中的局部数据。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
nqxcwl 发布了0 篇原创文章 · 获赞 1 · 访问量 2816 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: