欢迎进入教育资讯网!
当前页面: 首页 > 电脑IT培训 > Web前端 > JavaScript难点有哪些?这篇把你的难点都承包了!

JavaScript难点有哪些?这篇把你的难点都承包了!

来源:教育资讯网 32 2021-07-27

  ***小编要跟大家分享的文章是关于Web前端工程师会遇到的JavaScript难点有哪些?正在从事web前端工作的小伙伴们一定不会对JavaScript感到陌生,那么对于web程序员来说,工作的过程中都会遇到哪些难点呢?下面我们来一起看一看吧!

  1、立即执行函数

  立即执行函数,即ImmediatelyInvokedFunctionExpression

  (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作:

  (function(){

  //代码

  //...

  })();

  function(){…}是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。立即执行函数也可以理解为立即调用一个匿名函数。立即执行函数**常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名***。

  2、闭包

  对于闭包(closure),当外部函数返回之后,内部函数依然可以访问外部函数的变量。

  functionf1()

  {

  varN=0;//N是f1函数的局部变量

  functionf2()//f2是f1函数的内部函数,是闭包

  {

  N+=1;//内部函数f2中使用了外部函数f1中的变量N

  console.log(N);

  }

  returnf2;

  }

  varresult=f1();

  result();//输出1

  result();//输出2

  result();//输出3

  代码中,外部函数f1只执行了一次,变量N设为0,并将内部函数f2赋值给了变量result。由于外部函数f1已经执行完毕,其内部变量N应该在内存中被***,然而事实并不是这样:我们每次调用result的时候,发现变量N一直在内存中,并且在累加。为什么呢?这就是闭包的神奇之处了!

  3、使用闭包定义私有变量

  通常,JavaScript开发者使用下划线作为私有变量的前缀。但是实际上,这些变量依然可以被访问和修改,并非真正的私有变量。这时,使用闭包可以定义真正的私有变量:

  functionProduct(){

  varname;

  this.setName=function(value){

  ame=value;

  };

  this.getName=function(){

  returnname;

  };

  }

  varp=newProduct();

  p.setName(""Fundebug"");

  console.log(p.name);//输出undefined

  console.log(p.getName());//输出Fundebug

  代码中,对象p的的name属性为私有属性,使用p.name不能直接访问。

  4、prototype

  每个JavaScript构造函数都有一个prototype属性,用于设置所有实例对象需要共享的属性和方法。prototype属性不能列举。JavaScript*支持通过prototype属性进行继承属性和方法。

  functionRectangle(x,y)

  {

  this._length=x;

  this._breadth=y;

  }

  Rectangle.prototype.getDimensions=function()

  {

  return{

  length:this._length,

  breadth:this._breadth

  };

  };

  varx=newRectangle(3,4);

  vary=newRectangle(4,3);

  console.log(x.getDimensions());//{length:3,breadth:4}

  console.log(y.getDimensions());//{length:4,breadth:3}

  代码中,x和y都是构造函数Rectangle创建的对象实例,它们通过prototype继承了getDimensions方法。

  5、模块化

  JavaScript并非模块化编程语言,至少ES6落地之前都不是。然而对于一个复杂的Web应用,模块化编程是一个**基本的要求。这时,可以使用立即执行函数来实现模块化,正如很多JS库比如jQuery以及我们Fundebug都是这样实现的。

  varmodule=(function(){

  varN=5;

  functionprint(x){

  console.log(""Theresultis:""+x);

  }

  functionadd(a){

  varx=a+N;

  print(x);

  }

  return{

  description:""Thisisdescription"",

  add:add

  };

  })();

  console.log(module.description);//输出""thisisdescription""

  module.add(5);//输出“Theresultis:10”

  所谓模块化,就是根据需要控制模块内属性与方法的可访问性,即私有或者公开。在代码中,module为一个**的模块,N为其私有属性,print为其私有方法,decription为其公有属性,add为其共有方法。

  6、变量提升

  JavaScript会将所有变量和函数声明移动到它的作用域的**前面,这就是所谓的变量提升(Hoisting)。也就是说,无论你在什么地方声明变量和函数,解释器都会将它们移动到作用域的**前面。因此我们可以先使用变量和函数,而后声明它们。

  但是,**是变量声明被提升了,而变量赋值不会被提升。如果你不明白这一点,有时则会出错:

  console.log(y);//输出undefined

  y=2;//初始化y

  上面的代码等价于下面的代码:

  vary;//声明y

  console.log(y);//输出undefined

  y=2;//初始化y

  为了避免BUG,开发者应该在每个作用域开始时声明变量和函数。

  7、柯里化

  柯里化,即Currying,可以是函数变得更加灵活。我们可以一次性传入多个参数调用它;也可以只传入一部分参数来调用它,让它返回一个函数去处理剩下的参数。

  varadd=function(x){

  returnfunction(y){

  returnx+y;

  };

  };

  console.log(add(1)(1));//输出2

  varadd1=add(1);

  console.log(add1(1));//输出2

  varadd10=add(10);

  console.log(add10(1));//输出11

  代码中,我们可以一次性传入2个1作为参数add(1)(1),也可以传入1个参数之后获取add1与add10函数,这样使用起来非常灵活。

  8、apply,call与bind方法

  JavaScript开发者有必要理解apply、call与bind方法的不同点。它们的共同点是***个参数都是this,即函数运行时依赖的上下文。

  三者之中,call方法是**简单的,它等价于指定this值调用函数:

  varuser={

  ame:""RahulMhatre"",

  whatIsYourName:function(){

  console.log(this.name);

  }

  };

  user.whatIsYourName();//输出""RahulMhatre"",

  varuser2={

  ame:""NehaSampat""

  };

  user.whatIsYourName.call(user2);//输出""NehaSampat""

  apply方法与call方法类似。两者***的不同点在于,apply方法使用数组指定参数,而call方法每个参数单独需要指定:

  §apply(thisArg,[argsArray])

  §call(thisArg,arg1,arg2,…)

  varuser={

  greet:""Hello!"",

  greetUser:function(userName){

  console.log(this.greet+""""+userName);

  }

  };

  vargreet1={

  greet:""Hola""

  };

  user.greetUser.call(greet1,""Rahul"");//输出""HolaRahul""

  user.greetUser.apply(greet1,[""Rahul""]);//输出""HolaRahul""

  使用bind方法,可以为函数绑定this值,然后作为一个新的函数返回:

  varuser={

  greet:""Hello!"",

  greetUser:function(userName){

  console.log(this.greet+""""+userName);

  }

  };

  vargreetHola=user.greetUser.bind({greet:""Hola""});

  vargreetBonjour=user.greetUser.bind({greet:""Bonjour""});

  greetHola(""Rahul"")//输出""HolaRahul""

  greetBonjour(""Rahul"")//输出""BonjourRahul""

  9、Memoization

  Memoization用于优化比较耗时的计算,通过将计算结果缓存到内存中,这样对于同样的输入值,下次只需要中内存中读取结果。

  functionmemoizeFunction(func)

  {

  varcache={};

  returnfunction()

  {

  varkey=arguments[0];

  if(cache[key])

  {

  returncache[key];

  }

  else

  {

  varval=func.apply(this,arguments);

  cache[key]=val;

  returnval;

  }

  };

  }

  varfibonacci=memoizeFunction(function(n)

  {

  return(n===0||n===1)?n:fibonacci(n-1)+fibonacci(n-2);

  });

  console.log(fibonacci(100));//输出354224848179262000000

  console.log(fibonacci(100));//输出354224848179262000000

  代码中,第2次计算fibonacci(100)则只需要在内存中直接读取结果。

  10、函数重载

  所谓函数重载(method

  overloading),就是函数名称一样,但是输入输出不一样。或者说,允许某个函数有各种不同输入,根据不同的输入,返回不同的结果。凭直觉,函数重载可以通过if…else或者switch实现,这就不去管它了。jQuery之父John

  Resig提出了一个非常巧(bian)妙(tai)的方法,利用了闭包。

  从效果上来说,people对象的find方法允许3种不同的输入:

  0个参数时,返回所有人名;1个参数时,根据firstName查找人名并返回;2个参数时,根据完整的名称查找人名并返回。

  难点在于,people.find只能绑定一个函数,那它为何可以处理3种不同的输入呢?它不可能同时绑定3个函数find0,find1与find2啊!这里的关键在于old属性。

  由addMethod函数的调用顺序可知,people.find**终绑定的是find2函数。然而,在绑定find2时,old为find1;同理,绑定find1时,old为find0。3个函数find0,find1与find2就这样通过闭包链接起来了。

  根据addMethod的逻辑,当f.length与arguments.length不匹配时,就会去调用old,直到匹配为止。

  functionaddMethod(object,name,f)

  {

  varold=object[name];

  object[name]=function()

  {

  //f.length为函数定义时的参数个数

  //arguments.length为函数调用时的参数个数

  if(f.length===arguments.length)

  {

  returnf.apply(this,arguments);

  }

  elseif(typeofold===""function"")

  {

  returnold.apply(this,arguments);

  }

  };

  }

  //不传参数时,返回所有name

  functionfind0()

  {

  returnthis.names;

  }

  //传一个参数时,返回firstName匹配的name

  functionfind1(firstName)

  {

  varresult=[];

  for(vari=0;i

  {

  if(this.names[i].indexOf(firstName)===0)

  {

  result.push(this.names[i]);

  }

  }

  returnresult;

  }

  //传两个参数时,返回firstName和lastName都匹配的name

  functionfind2(firstName,lastName)

  {

  varresult=[];

  for(vari=0;i

  {

  if(this.names[i]===(firstName+""""+lastName))

  {

  result.push(this.names[i]);

  }

  }

  returnresult;

  }

  varpeople={

  ames:[""DeanEdwards"",""AlexRussell"",""DeanTom""]

  };

  addMethod(people,""find"",find0);

  addMethod(people,""find"",find1);

  addMethod(people,""find"",find2);

  console.log(people.find());//输出[""DeanEdwards"",""AlexRussell"",""DeanTom""]

  console.log(people.find(""Dean""));//输出[""DeanEdwards"",""DeanTom""]

  console.log(people.find(""Dean"",""Edwards""));//输出[""DeanEdwards""]

免责声明

非本网作品均来自互联网,转载目的在于传递更多信息,并不**本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其他问题,请及时与本网联系,我们将及时删除内容。

猜你喜欢

热点排行榜

教育部即将调整中小学上课时间,学生真的高兴坏了!
教育,是任何一个国家和民族的未来。如果没有了教育,那么这个国家和民族未来也会以前黑暗。随着知识在社会中的作用越来越大,人们也越来越重视教育。尤其是家长,为了能让孩子学习好,对于教育的投资可以说是不计代价!在许多人都越来越注重学习成绩的同时,孩子的学习压力却是越来越大,有的时候甚至孩子的睡眠时间都会严重不足。 如此一来虽然看似是孩子的学习成绩进步了,但是却严重影响了孩子的正常健康发育。如此
来看看在双减政策后,到底公立学校和私立学校有什么差距?
大部分的中小学生,都会选择在公立学校接受义务教育,但是随着教育“内卷”的情况越来越严重,不少学生家长会选择将孩子送到私立学校去上学,在这样的情况之下,中小学生的学习压力也越来越大,因此中小学生在上学的过程中,也会觉得非常疲惫。这种状态不*不利于学生们提高学习成绩,更不利于学生们成长,因此相关部门也是引起了高度重视。 随着“双减”政策的实行,学生们的学习压力也在逐渐减小,“双减”实行后,公
为了推行三胎,课本的封面也变成三胎了,来看看人社部怎么说的~
开学没几天,网络上就开始流传着热心家长们对语文课本的“新发现”:一年的时间,课本封面由二胎变成了三胎,妈妈也不打扮了,头发随便一扎,衣服还是去年那件,只是旧了。多了个娃,爸爸也不在家下棋了,估计为了养家加班挣钱去了。家长们口中的两个封面分别是统编语文教材五年级上册、六年级上册封面。这段“看图说话”因为贴近“三胎”的社会热点,迅速引发了众多网友的共鸣、转发。人民教育出版社在其公众号上进行了“辟谣”:
清华北大亚洲***排名来啦!泰晤士公布了2022世界大学排名结果!
综合报道,当地时间2日,泰晤士高等教育特刊(Times Higher Education,简称THE)更新了***2022年THE世界大学排名。中国高校排名再次上升,***有两所大学进入前20名,创下亚洲比较好纪录。根据新发布的排名,北大和清华并列第16名,这是***中国有两所大学进入前20名,也亚洲国家迄今为止的比较高排名。此外,中国内地共有10所大学进入前200名。根据排名,牛津大学连续6年位列***。美
怎么选择美国留学中介?选的时候一定要清醒!
此篇文章会把下面很多问题中的内容阐述的逻辑层次更简单分明一些,假使同学们如果没有太多时间,不妨粗略阅读下面的问题,大概了解下!我计划去美国留学入读硕士,想请教一下如何选择美国留学中介机构呢?美国留学中介选择策略:衡量自己的消费者心理选择美国留学中介机构请务必要依据你的需求进行相关选择。首先你需要询问自己,你申请是要干什么呢?这个问题就像是购买衣服和鞋,你买运动鞋,就不会去西装店。美国留学作为一个很
英语的单词怎么写才好看?学会这几个小习惯,你也能写的好看!
英语学习重视听说读写,其中的写作涉及标准的写作规范。以下是英语单词写法的介绍,供参考。1.倾斜。每个字母稍微向右倾斜,大约在5°~20°之间,但每个字母的倾斜必须一致,所以很漂亮。2.大写字母。大写字母都一样高,占上面的两个格子,顶部面向***条线。3.小写字母。中间一格小写字母a、c、e、m、n、o、r、s、u、v、w、x、z写在中间一格中,上下抵抗,但不及格。小写字母B、D、H、K、L上端顶**
乐读推出一年级20人在线小班:通过小班教学 建构积极有效的师生互动
随着全国各地中小学和幼儿园秋季开学时间的确定,幼小、初小衔接又成了热点话题,但究竟要如何“衔接”,并不是每位家长都有科学的认识。乐读20人在线小班面向一年级孩子,激发兴趣、培养习惯,希望科学有效地帮助孩子适应小学学习生活,实现从幼儿教育阶段到小学教育阶段的顺利过渡。从孩子喜闻乐见的事物入手,培养学习的兴趣小学生活泼好动,注意力持续时间短,不少孩子初入小学课堂可能会出现发呆、坐不住的情况。据此,家长
学而思网校的线下校区即将关闭,只因房租成本过高!
9月27日消息,据媒体报道,学而思老师群内告知家长,因运营成本过高,不足以支撑面授班运营,所有面授课转为在线班。并统一在10月9日中午12:00开启转线上功能。此外,多名学而思工作人员均表示线下校区将会关闭。业内人士指出,在高额的房租下,退租关店也许是**理智的做法。目前线下教培机构在节假日、休息日及寒暑假的营收能占到全年收入的一半以上,但是现在不让上课,商业模型该怎么搭,目前很多线下机构恐怕还没想
教育部又来消息了,以后这类竞赛要被管理了!速来看看!
9月23日,教育部举行新闻通气会,介绍规范校外培训机构管理制度建设有关情况。会上,教育部校外教育培训监管司负责人介绍,“双减”工作是一项长期性复杂性系统性的工程,必须注重当前和长远相统一,研究修订竞赛管理办法,将治理打着“国际”旗号的各类竞赛。教育部校外教育培训监管司负责人表示,加快预收费监管、加强培训机构党建等其他配套政策法规的制订进度。同时完善“营改非”流程,进一步明确过程中的公示期限、资产确
各大高校开学了,清华大学开学典礼的主题演讲走红了,这个主题真不错!
9月是开学季,很多人带着对大学的憧憬迈入校园。在清华大学开学典礼上,一段开学演讲走红。教师**梅赐琪没有讲成功,而是讲失败。在他看来,与成功相比,失败能带给人更多可能性。以下是演讲全文:首先请允许我**我的同事们向***(9月2日)入学的2021级同学们表示**热烈的祝贺!每一级的清华人都是特殊的,但是你们还是要更特殊一些。在人类和七种冠状病毒的遭遇之中,你们中的绝大多数见证了其中**危险的两次,一次懵