网站建设收费标准,wordpress uctheme,网络营销师报考条件,侠客推 网站建设1、LHS和RHS查询编译一段代码#xff0c;需要js引擎和编译器#xff08;js引擎负责整个程序运行时所需的各种资源的调度#xff0c;编译器只是js引擎的一部分#xff0c;负责将JavaScript源码编译成机器能识别的机器指令#xff0c;然后交给引擎运行#xff09;编译的过程…1、LHS和RHS查询编译一段代码需要js引擎和编译器js引擎负责整个程序运行时所需的各种资源的调度编译器只是js引擎的一部分负责将JavaScript源码编译成机器能识别的机器指令然后交给引擎运行编译的过程分词/词法分析--解析/语法分析--代码生成分词/词法分析将一连串字符打断成有意义的片段称为token比如var a2;分词的token有var、a、、2和;解析/语法分析编译器将一个token的流数组转换为一个抽象语法树AST--Abstract Syntax Tree它表示了程序的语法结构。代码生成编译器将上一步中生成的抽象语法树转换为机器指令等待引擎执行。执行LHSLeft-hand Side)和RHSRight-hand Side是在代码执行阶段JS引擎操作变量的两种方式区别在于LHS是赋值而RHS是查询。LHS和RHS获取变量的位置就是作用域。2、什么是作用域作用域指程序中定义变量的作用域它决定了当前执行代码对变量的访问权限。全局作用域程序的最外层作用域一直存在。函数作用域函数作用域只有函数被定义时才会创建包含在父级函数作用域/全局作用域中。每段独立的执行代码块只能访问自己作用域和外层作用域中的变量无法访问到内层作用域的变量。3、作用域链当可执行代码内部访问变量时会先查找本地作用域如果找到目标变量即返回否则会去父级作用域继续查找......一直找到全局作用域。把这种作用域的嵌套机制称为作用域链。函数的参数也在函数作用域中。4、词法作用域静态作用域与动态作用域JavaScript使用的作用域类型。函数被定义的时候它的作用域就已经确定了和拿到哪里执行没有关系因此词法作用域也被称为“静态作用域”。var value 1;function foo() {console.log(value);
}function bar() {var value 2;foo();
}bar();// 结果是 ???这段代码中一共有三个作用域全局作用域、foo的函数作用域和bar的函数作用域。foo里面访问量本地作用域中没有定义的变量value为了拿到这个变量要去foo的上层作用域中找。上层作用域是bar还是foo定义时的全局作用域呢按照词法作用域中的定义在foo被定义的时候作用域已经被确定了所以它的上层作用域是全局作用域所以结果应当是1.动态作用域程序执行期间对于一个名字x的使用指向的是最近被调用但还没有终止且声明了x的过程中的这个声明。var value 1;function foo() {var value3console.log(value);
}function bar() {var value 2;foo();
}bar();// 结果是 3总结词法作用域静态作用域是关联在编译期间的对于函数来说就是函数定义的位置决定了该函数所属范围动态作用域是关联在程序执行期间的对函数来说就是函数执行的位置决定了函数的所属的范围。5、块级作用域{....块级作用域}注意用var定义的变量可以在块级作用域外访问到‘ES6使用let和const代替var关键字来创建块级作用域。if(true){
var a1
}
console.log(a)//1if(true){
let a2
}
console.log(a)//Reference6、创建作用域1函数作用域function f(){//f的函数作用域
}2块级作用域使用let和const创建for(let i0;i4;i){console.log(i)
//i的块级作用域
}3块级作用域使用try...catch...try{undefined()//强制产生异常
}catch(err){console.log(err)//TypeError:undefined is not a function
}
console.log(err)//err is not defined4使用eval欺骗词法作用域性能问题不推荐function foo(str,a){eval(str)console.log(a,b)
}
var b1
foo(var b2,1)//1 2
eval(str)即eval(var b2)会被当作在foo中有语句var b2来执行所以相当于在函数foo内部创建了一个变量b所以打印出的b为2但是在严格模式下eval...有着自己的词法作用域其中的声明无法修改其中的作用域function foo(str){use stricteval(str);console.log(a); // ReferenceError:a is not defined
}foo(var a 2);与eval(...)功能类似的其他函数setTimeout(..) 和 setInterval(..) 的第一个参数可以是字符串字符串的内容可以被解释为一段动态生成的函数代码。这些功能已经过时且不被提倡。不要使用他们。new Function(..) 函数的行为也很类似最后一个参数可以接受代码字符串并将其转为动态生成的函数前面的参数是这个新生成的函数的形参。这种构建函数的语法比 eval(..) 略微安全一些但也要尽量避免使用。5with性能问题不推荐eval(..) 函数如果接受了一个含有一个或多个声明的代码就会修改其所处的词法作用域而 with 声明实际上是根据你传递给它的对象凭空创建了一个全新的词法作用域。function foo(obj){with(obj){a 2;}
}var o1 {a:3
};
var o2 {b:3
};
//分别定义了o1和o2两个对象o1中只有属性a,o2中只有属性bfoo(o1);
console.log(o1.a); //2
//with会单独创建自己的作用域在o1中找到了属性aa2即将值2赋给了属性afoo(o2);
console.log(o2.a); //undefined
//with创建独属于自己的作用域o2o2中没有属性a,然后在上层作用域中查找也没有找到变量a所以会单独创建全局变量a并赋值为2此时是正常的 LHS 表示法查找
console.log(a); // 2 ---不好a 被泄露到全局作用域上了总结JavaScript 中有两个机制可以“欺骗”词法作用域eval(..) 和 with。前者可以对一段包含一个或多个声明的“代码”字符串转换为动态作用域并借此来修改已经存在的词法作用域在运行时。后者本质上是通过将一个对象的引用当作作用域来处理将对象的属性当作作用域中的标识符来处理从而创建了一个新的词法作用域同样是在运行时。这两个机制的副作用是引擎无法在编译时对作用域查找进行优化因为引擎只能谨慎地认为这样的优化是无效的。使用这其中任何一个机制都将导致代码运行变慢。不要使用它们。7、作用域的应用场景模块化立即使用函数表达式Immediately Invoked Function Expression简写IIFE//module1.js
(function(){var a1console.log(a)
})();//module2.js
function(){var a2console.log(a)
})()(function(global){if(global...){//is browser}else if(global...){//is nodejs}
})(window)8、闭包能够访问其他函数内部变量的函数称为闭包。闭包就是函数内部定义的函数被返回了出去并在外部调用。闭包的执行看起来是绕过了作用域的监管机制从外部也能获取到内部作用域的信息。8.1、闭包的应用场景需要维护内部变量单例模式一个类只能有一个实例。实现方式是先判断实例是否存在如果存在直接返回该实例不存在则返回新创建的实例。单例的好处是避免重复实例化带来的内存开销function Singleton(){this.datasingleton
}
Singleton.getInstance(function(){var instance;return function(){if(instance){return instance}else{instancenew Singleton()return instance}}
})();
var saSingleton.getInstance()
var sbSingleton.getInstance()
console.log(sasb)//true
console.log(sa.data)//singleton模拟私有属性function getPrivateAttribute(){var _nameJohnvar _age24return function(){return {getName:function(){return _name},getAge:function(){return _age}}}
}
var objgetPrivateAttribute()()//返回了{getName:function(){return _name},getAge:function(){return _age}}
console.log(obj.getName())//John
console.log(obj.getAge())//24
console.log(obj._age)//undefined 柯里化把接受多个参数的函数变换成接受一个单一参数最初函数的第一个参数的函数并且返回接受余下的参数而且返回结果的新函数。常见的bind方法就是用柯里化的方法来实现Function.prototype.myBindfunction(contextwindow){if(typeof this!function)throw new Error(Error)let selfFuncthislet args[...arguments].slice(1)return function F(){//因为返回了一个函数可以new F()所以需要判断if(this instance of F){return new selfFunc(...args,arguments)}else{//bind可以实现类似这样的代码f.bind(obj,1)(2)所以需要将两边的参数拼接起来return selfFunc.apply(context,arg.concat(arguments))}}
} 8.2、闭包带来的问题内存泄露详见JavaScript内存泄露和垃圾回收机制9、总结1JavaScript语言层面原生支持全局作用域、块级函数作用域全局作用域程序运行就有函数作用域只有定义函数的时候才有它们之间是包含的关系。2词法静态作用域和动态作用域静态作用域指函数定义的时候就确定了作用域动态作用域指函数执行的时候才会确定。eval(str)和with(obj)会欺骗词法作用域eval(str)会将str作为语句执行with则是创建独属于obj的作用域如果找不到会继续向上层作用域查找找不到则会创建全局变量找到则重新给变量赋值。因此evel和with造成引擎无法在作用域查找时进行优化造成性能问题不推荐使用。3作用域之间是可以嵌套的嵌套关系称为作用域链。4可执行代码在作用域中查询变量时只能查询本地作用域及上层作用域不能查找内部的作用域。JS引擎搜索变量时会先查询本地作用域找到立即返回找不到会去上层作用域中查找层层往上直到全局作用域。5有权访问另一个函数内部的函数称为闭包。闭包的本质是利用了作用域的机制来达到外部作用域访问内部作用域的目的。缺点是可能造成内存泄露。
文章转载自: http://www.morning.tyjp.cn.gov.cn.tyjp.cn http://www.morning.lwwnq.cn.gov.cn.lwwnq.cn http://www.morning.mtsck.cn.gov.cn.mtsck.cn http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn http://www.morning.gwqkk.cn.gov.cn.gwqkk.cn http://www.morning.hhskr.cn.gov.cn.hhskr.cn http://www.morning.wfzdh.cn.gov.cn.wfzdh.cn http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.wiitw.com.gov.cn.wiitw.com http://www.morning.ntgsg.cn.gov.cn.ntgsg.cn http://www.morning.rykx.cn.gov.cn.rykx.cn http://www.morning.jbpdk.cn.gov.cn.jbpdk.cn http://www.morning.sjsfw.cn.gov.cn.sjsfw.cn http://www.morning.qtzk.cn.gov.cn.qtzk.cn http://www.morning.mdgpp.cn.gov.cn.mdgpp.cn http://www.morning.qzpw.cn.gov.cn.qzpw.cn http://www.morning.pphgl.cn.gov.cn.pphgl.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.nyqm.cn.gov.cn.nyqm.cn http://www.morning.wfjrl.cn.gov.cn.wfjrl.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.tgfsr.cn.gov.cn.tgfsr.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.lhrcr.cn.gov.cn.lhrcr.cn http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.kxqfz.cn.gov.cn.kxqfz.cn http://www.morning.gchqy.cn.gov.cn.gchqy.cn http://www.morning.bpncd.cn.gov.cn.bpncd.cn http://www.morning.lmhh.cn.gov.cn.lmhh.cn http://www.morning.xhkgl.cn.gov.cn.xhkgl.cn http://www.morning.qbrs.cn.gov.cn.qbrs.cn http://www.morning.dbqg.cn.gov.cn.dbqg.cn http://www.morning.pbxkk.cn.gov.cn.pbxkk.cn http://www.morning.mgkcz.cn.gov.cn.mgkcz.cn http://www.morning.mgtrc.cn.gov.cn.mgtrc.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.tpfny.cn.gov.cn.tpfny.cn http://www.morning.dqrpz.cn.gov.cn.dqrpz.cn http://www.morning.cknsx.cn.gov.cn.cknsx.cn http://www.morning.qtqk.cn.gov.cn.qtqk.cn http://www.morning.fqhbt.cn.gov.cn.fqhbt.cn http://www.morning.kzrbd.cn.gov.cn.kzrbd.cn http://www.morning.lztrt.cn.gov.cn.lztrt.cn http://www.morning.czcbl.cn.gov.cn.czcbl.cn http://www.morning.mlfgx.cn.gov.cn.mlfgx.cn http://www.morning.fylsz.cn.gov.cn.fylsz.cn http://www.morning.ntcmrn.cn.gov.cn.ntcmrn.cn http://www.morning.sgnjg.cn.gov.cn.sgnjg.cn http://www.morning.lxqyf.cn.gov.cn.lxqyf.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.rwmqp.cn.gov.cn.rwmqp.cn http://www.morning.fdfsh.cn.gov.cn.fdfsh.cn http://www.morning.jbhhj.cn.gov.cn.jbhhj.cn http://www.morning.bnxnq.cn.gov.cn.bnxnq.cn http://www.morning.lfttb.cn.gov.cn.lfttb.cn http://www.morning.rqhdt.cn.gov.cn.rqhdt.cn http://www.morning.rmryl.cn.gov.cn.rmryl.cn http://www.morning.qxmpp.cn.gov.cn.qxmpp.cn http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.lxfyn.cn.gov.cn.lxfyn.cn http://www.morning.jrwbl.cn.gov.cn.jrwbl.cn http://www.morning.ktntj.cn.gov.cn.ktntj.cn http://www.morning.zbgqt.cn.gov.cn.zbgqt.cn http://www.morning.dmwjl.cn.gov.cn.dmwjl.cn http://www.morning.fhghy.cn.gov.cn.fhghy.cn http://www.morning.zynjt.cn.gov.cn.zynjt.cn http://www.morning.bpds.cn.gov.cn.bpds.cn http://www.morning.rhlhk.cn.gov.cn.rhlhk.cn http://www.morning.dfrenti.com.gov.cn.dfrenti.com http://www.morning.yjmns.cn.gov.cn.yjmns.cn http://www.morning.grxsc.cn.gov.cn.grxsc.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.tsmxh.cn.gov.cn.tsmxh.cn http://www.morning.spwln.cn.gov.cn.spwln.cn http://www.morning.tfkqc.cn.gov.cn.tfkqc.cn http://www.morning.kdnrc.cn.gov.cn.kdnrc.cn http://www.morning.hmmnb.cn.gov.cn.hmmnb.cn