首页 > 基础知识  >  js var 作用域,javascript 预解析 作用域问题-

js var 作用域,javascript 预解析 作用域问题-

2020-05-04 20:08:19 变量 作用 环境 执行 我要评论

变量,作用域知多少

ECMAScript的的变量有两种类型:基本类型(值类型):简单数据段引用类型:多个值构成的对象在变量赋值结束后,解析器必须知道这个变量时基本数据类型还是引用类型,需要注意的是string在js中是值类型。复制的差异值类型的复制会在内存中创建副本,所以彼此间不会影响,但是引用类型只是将变量的引用复制,其指向的仍7a6431333337396332然是一个对象,会相互影响:1 var a = {};2 a.a = 6;3 var b = a;4 b.a = 66;5 alert(a.a);//66这是一个典型的例子,值类型的就不举例了。执行环境与作用域PS:作用域是面试官的最爱,也是我们经常栽跟头的地方,这块我们有必要搞清楚执行环境(execution)是javascript中非常重要的一个概念。执行环境定义了变量或者函数有权限访问其他数据,决定了他们各自的行为。每一个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存到这个对象中,虽然代码无法访问,但是解析器会用到他。在web浏览器中window对象便是我们的全局执行环境(最外围的执行环境,宿主不同便有差异,比如node.js可能就不一样),因此所有全局变量和函数都是作为window对象的属性或者方法创建的。销毁某个执行环境中的所有代码执行完毕,该环境便销毁,变量对象中的属性和函数也就完蛋了(闭包会让情况有所不同)。函数作用域每个函数都有自己的“作用域”范围(执行环境),当执行流进入一个函数时,函数的环境就会进入一个环境栈中,在函数执行完毕后,栈会将其环境弹出,控制权又重新交回之前的环境。ECMAScript程序的执行流就是这个机制在控制。作用域链当代码在一个环境中执行时会创建变量对象(variable object),并且该对象拥有一个作用域链,作用域链的用途是保证对执行环境有权限访问的所有变量与函数的有序访问。作用域的最前端便是当前执行代码所在环境的变量对象,若这个变量时函数,就将其活动对象(activation object)作为变量对象,活动对象最开始只包含一个变量arguments,整个作用域链会一直向上延伸直到window,这里上一个经典的例子:1 var color = 'blue'; 2 function changeColor() { 3 var anotherColor = 'red'; 4 function swapColor() { 5 var tmpColor = anotherColor; 6 anotherColor = color; 7 color = tmpColor; 8 } 9 swapColor();10 }11 changeColor();以上代码涉及三个执行环境(execution context):① 全局环境② changeColor局部环境③ swapColor局部环境全局变量中有一个color和一个函数changeColorchangeColor中有一个anotherColor变量和swapColor函数swapColor函数中有tmpColor,但是他可以访问以上所有的变量

angularjs 作用域改变自动触发什么事件

如果我想实现这样一个功能,当一个input失去光标焦点时(blur),执行一些语句,比如当输入用户名后,向后台发ajax请求zhidao查询用户名是否已经存在,好有及时的页面相应。 输入 camnpr angularjs directive input focus 失去焦点后提示 camnpr

JavaScript-绑定作用域,这里为什么会说没有push方法呢?

执行闭来包时:(function(_this){})(this); 传入的this参数是window对象,所以在return function(){return _func.apply(_this,arguments);};中_this为window, 并不是你预源期的object对象,那么 ,这就可以理解为百什么 this.voicemail.push(message);出错度了,因为它等同于:window.voicemail.push(message);

js中 变量作用域问题

$.post()你异步请求,在Ajax还没调用完毕,就已经执行到最后一句console.log(jsondata)了。所以就没值。不信,你可以将你post的请求类型改为同步,就有值了。

JS作用域的几个问题求解答

.ES5中的作用域for(var i =0;i<10;i++){}console.log(i)1234js这段代码,你觉得会输出什么?答案是10,熟悉java的同学肯定有点诧异,为什么会这样呢?因为js还是不同与java的,在ES5中,只有全局作用域和函数作用域,并没有块作用域,当然我们可以实现块作用域的功能。看下面代码:(function(){for(var i =0;i<10;i++){}})()console.log(i)123456这种写法叫做立即调用函数表达式(IIFE),不了解自行百度,这其实就创建了一个局部作用域,该作用域声明的变量只有在该块内有效,外部访问不了。这种写法的好处就是可以做到不污染全局变量。 这里还想再提一e68a84e8a2ad7a6431333365653232点,就是在ES5中,变量的声明问题,在ES5中并不是严格,你可以直接采用a=10,来声明一个全局变量。如下:a=10;console.log(a)12输出10,这里你可以不声明变量就去使用它,其实js帮你做了一件事。它会执行如下代码:var a=undefined;a=10;console.log(a)123你可以试验一下,在函数中也可以做到不用声明变量直接使用,个人觉得这种灵活的做法不是很好。不过在ES6中,已经不推荐不声明变量就去使用的做法了。 那么我们接下来来一点进阶的东西,就是变量提升。(ES5中的概念,ES6中新的用法不会出现变量提升),看代码:a=10;(function(){console.log(a)var a=1;})();1234567你猜输出什么?undefined,你答对了吗?迷糊不要紧,我们来看一下什么是变量提升,很简单,其实就是将变量的声明提升到函数的最上面。其实上面的代码最后js在解释的时候会变成这个样子:var a=undefined;a=10;(function(){var a=undefined;console.log(a)a=1;})();12345678理解了变量提升是什么意思了吧,其实就是将声明提到了最前面,所以输出的是undefined;2.ES6中的作用域 由于ES5中存在很多问题,所以在ES6中,用let替换了var的声明,不过为了兼容ES5你还是可以使用以前的var。不过还是建议使用let let为js添加了新的作用域就是块作用域。看代码:for(let i=0;i<10;i++){}console.log(a)123输出 a is not defined这里,我们就完全可以使用java等语音,来理解变量的声明了,而且使用let声明的变量,在声明是不可以使用的。a=3let a =10;alert(a)

    分享:

    微信

    相关文章