web前端面试入坑(1)
来源:互联网 发布:安全风险评估矩阵 编辑:程序博客网 时间:2024/06/08 06:52
疑难点1.“3函数”——call、apply、bind
<script type="text/javascript">function xiaohong(){ alert("小红");}function xiaoming(){ return "小明";}//xiaohong();xiaohong.call(xiaoming)</script>
解析:上述函数中“xiaohong.call(xiaoming)”表示xiaohong()函数里的this对象,指向了xiaoming()里的对象,但是函数调用依旧是xiaohong()
call()用法:用在函数上边的
案例1:this对象不改变
<script type="text/javascript"> var Dog = function(){ this.name="汪星人"; this.shout = function(){ alert(this.name); }};var Cat = function(){ this.name="喵星人";};var dog= new Dog();var cat=new Cat();dog.shout(); //"汪星人"//若想Cat含有shout方法,即可需要call()dog.shout().call(cat); //dog.shout中的this对象,将指向cat对象</script>
案例2:写一个函数,this指向不同的对象
<script type="text/javascript"> var xh={ name:"小红", job:"JS工程师"};var xm={ name:"小明", job:"资深前端开发工程师"};var jx={ name:"杰西", job:"前端开发总监"};function myjob(){ alert(this.name+"是一名"+this.job);}myjob.call(xh); //将myjob中this指向xhmyjob.call(xm); //将myjob中this指向xm</script>
注意:若将上述案例中“call”改为“apply”,结果相同,但区别是什么呢?
将案例2进行修正,如下:
<script type="text/javascript"> var xh={ name:"小红", job:"JS工程师"};var xm={ name:"小明", job:"资深前端开发工程师"};var jx={ name:"杰西", job:"前端开发总监"};function myjob(gender,age,company){ alert(this.name+gender+"今年"+age+"岁,在"+company+"担任"+this.job +"一职");}myjob.call(xh,'女',22,"腾讯"); myjob.call(xm,'男',23,"京东"); myjob.apply(xh,['女',22,"腾讯"]);myjob.apply(xm,['男',23,'京东']);</script>
call() VS apply()总结:
(1)在call()传入参数的时候,需要与函数所接受的参数——一一对应
(2)在apply()传入参数的时候,则必须以“数组”的方式传入,
数组中的元素,需要与函数所接受的参数——一一对应
案例3:bind()
<script type="text/javascipt"> var info=["W3C","QQ","Sina","Sohu"]; var it ={ info:["前端开发网","腾讯","新浪","搜狐"], getInfo: function(){ alert(this.info.join(",")); }};//it.getInfo();var data=it.getInfo;data(); //this指向windows对象,"W3C,QQ,Sina,Sohu"//若需要弹出中文it中的内容,需要bind()函数var data1 = it.getInfo.bind(it);data(); //this指向it中的对象,即中文内容 </script>
解析:若不加bind()时,会发现this指向的是windows下“info对象”,加了bind()函数时,绑定了it对象,此时this对象即为“it对象”。
案例3-1:将一个对象赋予另一个对象的方法,需要使用bind()
<script type="text/javascript">var jx={ name:"杰西",gender:"男",age:24,say:function(){ alert(this.name+","+this.gender+",j今年"+this.age);}};jx.say(); //杰西,男,今年24岁var xm=jx.say.bind({name:"小明",gender:"男",age:23});xm(); //小明,男,今年23岁</script>
案例3-2:bind()函数中可以传入参数吗? 可以!
<script type="text/javascript"> var jx={ name:"杰西", job:"前端工程师", say:function(gender,age,company){ alert(this.name+","+gender+",今年"+age+"岁,在"+company+"担任"+this.job+"一职"); }};var data=jx.say.bind(jx,"男",24,"百度");data();</script>
总结:call、apply、bind都是可以绑架“this”,逼迫this指向其他对象,
作用:改变this对象至想要指向对象。
疑难点2.this对象
this作用:全局作用域中的this指向的是“window对象”
案例1:
<script type="text/javascript">var test=function(){ this.x=1; alert(this.x);};test(); //1function test2(){ alert(this.x); //1}var x=1;function test3(){ this.x=100;}test3(); alert(x); //100</script>
this“公理”:this关键字永远指向函数(方法)的所有者。
(1)函数被赋值于变量时“this”的问题
<script type="text/javascript">var info=["W3C","QQ","Sina"];var it={info:["W3C","腾讯","新浪"],getInfo:function(){alert(this.info.join(","));}};var data=it.getInfo;data();var data2=function(){ alert(this.info.join(","));};data2();</script>
(2)当作为对象方法时this的问题
<script type="text/javascript">function test(){ alert(this.x);}//var o={};//o.x=1;//o.t=test()//o.t();var o={ x:1, t:function test(){ alert(this.x); }}o.t(); //1</script>
(3)作为构造函数“this”的问题
<script type="text.javascript">function test(){ this.x=1;}var o=new test();alert(o.x); //1</script>
进行改造一下,如下:
<script type="text/javascript">var x=2;function test(){this.x=1;}var o=new test();alert(o.x); //1alert(x); //2</script>
(4)闭包中this的问题
<script type="text/javascript">var as={info:["W3C","腾讯","新浪"],getInfo:function(){console.log(this);console.log(this.info);/*function abc(){ console.log(this); console.log(this.info);} //window "undefined"*/var _this=this;function abc(){ console.log(_this); console.log(_this.info);};abc();}}as.getInfo();</script>
阅读全文
0 0
- web前端面试入坑(1)
- web前端面试知识点总结(1)
- Web前端初入
- web前端面试(三)
- web前端面试(四)
- web前端面试总结(一)
- Web前端面试基础知识(一)
- web前端面试集锦
- web前端面试01
- web前端面试技巧
- WEB前端面试
- Web前端面试集锦
- Web前端面试资源
- Web前端面试小记
- WEB前端面试重点
- web前端面试整理
- WEB前端面试重点
- web前端面试
- android 引入jni 的so库的方法
- linux 下mysql的安装
- 图像有用区域(bfs)
- 探秘lua词法分析
- Prime Path POJ
- web前端面试入坑(1)
- Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization总结
- tomcat 开启cgi配置
- 剑指offer---数组中的逆序对
- LeetCode331. Verify Preorder Serialization of a Binary Tree
- python批量预处理图片
- C/C++中怎样获取日期和时间
- 最新最全的网站内容联盟大全
- 功能:显示所有用户