问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

我现在看javascript代码能看懂可是一做东西脑子里一篇空白,而且写的代码总是出错,有什么办法可以解决。

发布网友 发布时间:2022-04-23 01:49

我来回答

6个回答

懂视网 时间:2022-04-23 06:10

针对于面向对象编程的。知乎上有一个高赞回答:

面向对象: 狗.吃(屎)

面向过程: 吃.(狗,屎)

但是这个例子觉得不太优雅,我改一下了,举一个优雅些的小例子说明一下面向对象和面向过程的区别。

需求:定义‘守候吃火锅'

面向对象的思想是:守候.动作(吃火锅)

面向过程的思想是:动作(守候,吃火锅)

代码实现方面:

//面向对象
//定义人(姓名)
let People=function(name){
 this.name=name;
}
//动作
People.prototype={
 eat:function(someThing){
 console.log(`${this.name}吃${someThing}`);
 }
}
//守候是个人,所以要创建一个人(new一次People)
let shouhou=new People('守候','男',24);
shouhou.eat('火锅');
//面向过程
let eat=function(who,someThing){
 console.log(`${who}吃${someThing}`);
}
eat('守候','火锅');

结果都一样,都是输出‘守候吃火锅'。但是万一我现在吃饱了,准备写代码了。这下怎么实现呢?看代码

//面向对象
shouhou.coding=function(){
 console.log(this.name+'写代码');
}
shouhou.coding();
//面向过程
let coding=function(who){
 console.log(who+'写代码');
}
coding('守候');

结果也一样:‘守候写代码'

但是不难发现面向对象更加的灵活,复用性和扩展性更加。因为面向对象就是针对对象(例子中的:‘守候')来进行执行某些动作。这些动作可以自定义扩展。

而面向过程是定义很多的动作,来指定谁来执行这个动作。

好了,面向对象的简单说明就到这里了,至于面向对象的三大特性:继承,封装,多态这个自行上网查找资料。

3.this

使用 JavaScript 开发的时候,很多开发者多多少少会被 this 的指向搞蒙圈,但是实际上,关于 this 的指向,记住最核心的一句话:哪个对象调用函数,函数里面的this指向哪个对象。

下面分几种情况谈论下

3-1.普通函数调用

这个情况没特殊意外,就是指向全局对象-window。

let username='守候'
function fn(){
 alert(this.username);//undefined
}
fn();

可能大家会困惑,为什么不是输出守候,但是在细看一看,我声明的方式是let,不会是window对象

如果输出守候,要这样写

var username='守候'
function fn(){
 alert(this.username);//守候
}
fn();
//---------------
window.username='守候'
function fn(){
 alert(this.username);//守候
}
fn();

3-2.对象函数调用

这个相信不难理解,就是那个函数调用,this指向哪里

window.b=2222
let obj={
 a:111,
 fn:function(){
 alert(this.a);//111
 alert(this.b);//undefined
 }
}
obj.fn();

很明显,第一次就是输出obj.a,就是111。而第二次,obj没有b这个属性,所以输出undefined,因为this指向obj。

但是下面这个情况得注意

let obj1={
 a:222
};
let obj2={
 a:111,
 fn:function(){
 alert(this.a);
 }
}
obj1.fn=obj2.fn;
obj1.fn();//222

这个相信也不难理解,虽然obj1.fn是从obj2.fn赋值而来,但是调用函数的是obj1,所以this指向obj1。

3-3.构造函数调用

let TestClass=function(){
 this.name='111';
}
let subClass=new TestClass();
subClass.name='守候';
console.log(subClass.name);//守候
let subClass1=new TestClass();
console.log(subClass1.name)//111

这个也是不难理解,回忆下(new的四个步骤)就差不多了!

但是有一个坑,虽然一般不会出现,但是有必要提一下。

在构造函数里面返回一个对象,会直接返回这个对象,而不是执行构造函数后创建的对象

3-4.apply和call调用

apply和call简单来说就是会改变传入函数的this。

let obj1={
 a:222
};
let obj2={
 a:111,
 fn:function(){
 alert(this.a);
 }
}
obj2.fn.call(obj1);

此时虽然是 obj2 调用方法,但是使用 了call,动态的把 this 指向到 obj1。相当于这个 obj2.fn 这个执行环境是 obj1 。apply 和 call 详细内容在下面提及。

3-5.箭头函数调用

首先不得不说,ES6 提供了箭头函数,增加了我们的开发效率,但是在箭头函数里面,没有 this ,箭头函数里面的 this 是继承外面的环境。

一个例子

let obj={
 a:222,
 fn:function(){ 
 setTimeout(function(){console.log(this.a)})
 }
};
obj.fn();//undefined

不难发现,虽然 fn() 里面的 this 是指向 obj ,但是,传给 setTimeout 的是普通函数, this 指向是 window , window 下面没有 a ,所以这里输出 undefined 。

换成箭头函数

let obj={
 a:222,
 fn:function(){ 
 setTimeout(()=>{console.log(this.a)});
 }
};
obj.fn();//222

这次输出 222 是因为,传给 setTimeout 的是箭头函数,然后箭头函数里面没有 this ,所以要向上层作用域查找,在这个例子上, setTimeout 的上层作用域是 fn。而 fn 里面的 this 指向 obj ,所以 setTimeout 里面的箭头函数的 this ,指向 obj 。所以输出 222 。

4.call和apply

call 和 apply 的作用,完全一样,唯一的区别就是在参数上面。

call 接收的参数不固定,第一个参数是函数体内 this 的指向,第二个参数以下是依次传入的参数。

apply接收两个参数,第一个参数也是函数体内 this 的指向。第二个参数是一个集合对象(数组或者类数组)

let fn=function(a,b,c){
console.log(a,b,c);
}
let arr=[1,2,3];

如上面这个例子

let obj1={
 a:222
};
let obj2={
 a:111,
 fn:function(){
 alert(this.a);
 }
}
obj2.fn.call(obj1);

call 和 apply 两个主要用途就是

1.改变 this 的指向(把 this 从 obj2 指向到 obj1 )

2.方法借用( obj1 没有 fn ,只是借用 obj2 方法)

5.闭包

闭包这个可能大家是迷糊,但是必须要征服的概念!下面用一个例子简单说下

let add=(function(){
let now=0;
return {
 doAdd:function(){
 now++;
 console.log(now);
}
}
})()

然后执行几次!

上图结果看到,now 这个变量,并没有随着函数的执行完毕而被回收,而是继续保存在内存里面。

具体原因说下:刚开始进来,因为是自动执行函数,一开始进来会自动执行,这一块

然后把这个对象赋值给 add 。由于 add 里面有函数是依赖于 now 这个变量。所以 now 不会被销毁,回收。这就是闭包的用途之一(延续变量周期)。由于 now 在外面访问不到,这就是闭包的另一个用途(创建局部变量,保护局部变量不会被访问和修改)。

可能有人会有疑问,闭包会造成内存泄漏。但是大家想下,上面的例子,如果不用闭包,就要用全局变量。把变量放在闭包里面和放在全局变量里面,影响是一致的。使用闭包又可以减少全局变量,所以上面的例子闭包更好!

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

vue+axios如何实现请求拦截功能

vue2实现购物车与地址选配案例分析

热心网友 时间:2022-04-23 03:18

编程重要的思路,首先有个目标,你要干什么,然后去构思你编程的思路(这个跟编程经验也有关),哪些代码需要预加载,哪些是需要触发方式,哪些代码可共用,共用的要提出来,整条思路清晰,代码的可读性才高,否则你早上写的,中午吃个饭,晚上就记不住逻辑了,第二天修改更是摸黑走路了。某个功能不会可以google一下(作为程序员还是先google再),这是快速的找到解决方法,其次可以查看帮助文档,养成经常看帮助文档的好习惯,毕竟帮助文档写的东西都是准确的、正确的,网上的代码不全靠得住,有好有烂,我曾经遇到一个全选/取消全选写法的问题,有人给我20-30行代码,但最后我只用了5行代码就完成了。至于调试可以使用ie 9、10的F12查看,新手不建议使用火狐的FireBug,很多功能完全看不懂。

热心网友 时间:2022-04-23 04:36

多写多练,要学会发现错误并找到解决问题的方法.对于语法上的错误,只要写代码时细心一些,代码规范一些,就可以避免.对于语意错误和逻辑错误,要多思考,多看看别人的优秀代码,理解别人处理问题的思路.
写程序不要怕出错,要学会发现问题,才能解决问题,从中吸取经验,这样才能进步.

热心网友 时间:2022-04-23 06:11

先掌握思路,想想你要的东西都需要什么,然后开始一点一点写,别想一口吃个大胖子。今天看到一篇文章挺好的,想写一个贪食蛇游戏,第一步你需要写出来一个方块,就是贪食蛇的一段 或者一个食物 然后再考虑其他的

热心网友 时间:2022-04-23 08:02

看的懂说明基本了解这个东西
但是你对这个东西没有掌握
可以说你要从头学
从基本的语法语法开始

热心网友 时间:2022-04-23 10:10

多做点应该就好了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...频数和频率成正比,2频数一定时,频率与总次数成反比,对不对_百度... ...总次数之间的关系是( ) A.频数越大,频率越大 B.总次数一定时,频数越... 实验的总次数、频数及频率三者的关系是( )A.频数越大,频率越大B.频数... 嘎牙鱼的做法大全 安无线网要用多少元网费要交多少元不用用了要不要交网费,想寻求大家的... 无线网费1年多少钱 "Hbr"作为“港”的缩写,其在英语中的使用频率和应用示例如何? 【车主点评:吉利汽车帝豪GL 使我荣华富贵】 请问,如果,家用,自动挡,帝豪gl,英朗,科沃兹,卡罗拉,轩逸,同等价位,建议... ...景点?既能休闲的时候看看又能长点知识@@谢谢各位了! 发那科编程软件 FANUC PMC编程软件 有谁帮我发个法兰克系统编程软件,本人学数控的,由于好久没有编程了,生疏了,拜托大家了 法兰克 FANUC 0i 数控加工中心软件编程 type3编程软件和法兰克编程软件哪个好用 请教学习自动编程下载软件,我会手动编程,用的是法兰克系统加工中心 如何用word绘制roadmap js新手问题? 上海美术培训机构排名? 深暗红色的羽绒服配墨绿色的打底裤配么……再需要配什么颜色的鞋子 我是js新手,请问一下我写的代码哪里错了?谢谢指点 为什么电脑和手机上,不能同时登陆2个? 为什么电脑和手机上,不能同时登陆2个? 插座并线,怎么把三股铜线塞到一个孔里? 接插座并线两根线要拧一起吗 这样的插座火线接哪里,零线接哪里,厕所的开关的线又接哪里(请详细回答线接哪个部位) 请问你知道一个开关穿线到插座然后在到灯盒里如何并线嘛? 请教:深圳站,指的是哪个火车站?家在深圳 啥意思?深圳站是指? 什么学韩语的软件好用 怎么能让智能电饭煲快速蒸饭,就是快煮时间也要40多分钟 智能电饭煲是不是比普通电饭煲煮饭,要慢一点,智能电饭煲的快速煮功能有多快? 微信上怎么不会显示有多少位好友了? 微信怎么设置隐藏,不让好友看到? 学习JavaScript需要注意哪些问题? 吊瓶烫斗喷水开关按不响什么问题 第一次乘坐飞机应该注意些什么 第一次坐飞机没有经验,请问需要注意什么? 电脑讯飞考试用搜狗的在线翻译算打开另一个窗口吗 我妹妹花费1000元买了一台新电脑用三种方式表达翻译? 小米翻译机有大屏幕的吗?字大好学习 孩子患上自闭症家长如何面对? 在js中程序出错的类型有哪两种 你好 我想问问我下载了你的微信小视频转发软件 怎么转发小视频啊?? 爱转发2.6就是微信可以转发小视频的软件怎么下载?下载地址? 优酷vip为什么只能免密支付? 支付宝小额免密支付关了,为什么优酷还可以直接续费? 开通了优酷会员连续续费,然后又取消了自动扣款免密支付,有什么影响? 优酷免密码vip是骗局吗 账户335**@qq.**于12月26日23时29分在优酷会员免密支付15.00元,怎么取消?