JS笔考试试题目教学课件.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1、使用typeof bar === object 判断 bar 是不是一个对象有神马潜在的弊端?如何避免这种弊端?使用typeof的弊端是显而易见的(这种弊端同使用instanceof):123456let obj = {};let arr = [];?console.log(typeofobj === object); //trueconsole.log(typeofarr === object); //trueconsole.log(typeofnull=== object); //true从上面的输出结果可知,typeof bar === object 并不能准确判断 bar 就是一个 Object。可以通过Object.prototype.toString.call(bar) === [object Object] 来避免这种弊端:123456let obj = {};let arr = [];?console.log(Object.prototype.toString.call(obj)); //[object Object]console.log(Object.prototype.toString.call(arr)); //[object Array]console.log(Object.prototype.toString.call(null)); //[object Null]另外,为了珍爱生命,请远离 ==:而 [] === false 是返回 false 的。2、下面的代码会在 console 输出神马?为什么?123456(function(){?vara = b = 3;})();?console.log(a defined? + (typeofa !== undefined)); console.log(b defined? + (typeofb !== undefined));这跟变量作用域有关,输出换成下面的:12console.log(b); //3console,log(typeofa); //undefined拆解一下自执行函数中的变量赋值:b = 3;var a = b;所以 b 成了全局变量,而 a 是自执行函数的一个局部变量。3、下面的代码会在 console 输出神马?为什么?12345678910111213varmyObject = {?foo: bar,?func: function() {?var self = this;?console.log(outer func: this.foo = + this.foo);?console.log(outer func: self.foo = + self.foo);?(function() {?console.log(inner func: this.foo = + this.foo);?console.log(inner func: self.foo = + self.foo);?}());?}};myObject.func();第一个和第二个的输出不难判断,在 ES6 之前,JavaScript 只有函数作用域,所以func中的 IIFE 有自己的独立作用域,并且它能访问到外部作用域中的 self,所以第三个输出会报错,因为 this 在可访问到的作用域内是 undefined,第四个输出是 bar。如果你知道闭包,也很容易解决的:1234(function(test) {?console.log(inner func: this.foo = + test.foo); //bar?console.log(inner func: self.foo = + self.foo);}(self));如果对闭包不熟悉,可以参考本文:从作用域链谈闭包4、将 JavaScript 代码包含在一个函数块中有神马意思呢?为什么要这么做?换句话说,为什么要用立即执行函数表达式(Immediately-Invoked Function Expression)。IIFE 有两个比较经典的使用场景,一是类似于在循环中定时输出数据项,二是类似于JQuery/Node 的插件和模块开发。12345for(vari = 0; i 5; i++) {?setTimeout(function() {?console.log(i); ?}, 1000);}上面的输出并不是你以为的0,1,2,3,4,而输出的全部是5,这时 IIFE 就能有用了:1234567for(vari = 0; i 5; i++) {?(function(i) {?setTimeout(function() {?console.log(i); ?}, 1000);?})(i)}而在J

文档评论(0)

js1180 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档