javaScript(五) 函数

本文详细介绍了JavaScript中函数的arguments对象、this关键字的行为,以及call(),apply(),bind()方法的使用。此外,还讨论了变量作用域(局部和全局)以及ES6中let和const的作用。文章以实例和面试题的形式探讨了这些概念在实际开发中的应用。
摘要由CSDN通过智能技术生成

在函数内部,有两个特殊对象:arguments和this;

arguments:在函数体内,arguments表示实参列表对象,它是一个类数组,可以通过下标访问实参值,例如:

function sum() {

return arguments[0]+arguments[1];

}

console.log(sum(1,2))

this:在函数体内,this是指函数执行的环境对象(也叫context),一般来说,this是指调用函数的对象,如果没有,就是全局对象,在浏览器中就是window对象

var a=function () {

console.log(this);

}

a(); //输出window对象

var obj={

a:function () {

console.log(this)

}

}

obj.a(); //输出obj

在js中,函数是一种特殊对象

函数是一种特殊的对象,意味着它也是一种值,所以函数可以当作参数传递,赋值变量,作为数组的元素等

function fa(a,b) {

return a(b)

}

function sum(d) {

return 1+d;

}

console.log(fa(sum,3));

函数是一种特殊的对象,那么也可以拥有属性和方法,函数有两个标准属性:length,name,方法有call,apply,bind

**length:**是该函数期望参数的个数,不包括默认值和剩余参数长度只计算到第一个参数默认参数或剩余参数前的位置,例如

function xa(a,mun=1,…mun2) { }

function xb(a,mun=1,num3,…mun2) { }

console.log(xa.length) //1

console.log(xb.length) //1

函数的name属性是该函数的名称,示例:

function sum1(d) {return 1+d;}

var obj={

a:function () {}

}

var ac=new Function();

console.log(sum1.name); //sum1

console.log(obj.a.name); //a

console.log(ac.name); //anonymous

第三个比较特殊,是一个匿名函数,所以属性名的输出为anonymous

下面的代码解释call(),apply(),bind()示例中,解决的同一个问题是:

1.如果用this.name获取到joy这个值

2.函数say如何接收更多的参数

call方法:调用函数,可以指定函数中的this和传参列表

var obj={

name:“joy”,

say:function (content) {

var say=function () {

console.log(this.name+’ say '+content)

};

say();

}

};

obj.say(“welcome”);

上例中的打印this.name并没有打印出本对象中的name,因为如果没有指定的话this指的是全局的window的window并没有name这个属性,所以没有显示,所以要做如下显示,将say(),这个启用,改成say.call(this),指定了对象是obj对象,当然这个写法等同于say.call(obj),但是这种写法如果对象名改变了就需要重写修改,不如this来的方便

var obj={

name:“joy”,

say:function (content) {

var say=function () {

console.log(this.name+’ say '+content)

};

say.call(this); //this改成obj也可以,但是可扩展性不高

}

};

obj.say(“welcome”);

如果想传入更多的参数那么可以改成obj.say(“welcome”,“school”,“name”),然后将say:function(content,a,b)这边修改

**apply方法:**调用函数,可以指定函数中的this和传入参数数组,注意,apply和call的区别在于传参call传的是参数列表,而apply传入的是数组

上例中,将

var obj={

name:“joy”,

say:function (content,array) {

var say=function () {

console.log(this.name+’ say '+content+array[0]+array[1])

};

say.apply(this);

}

};

obj.say(“welcome”,[" a “,” b "]);

call()方法和apply()方法没有实质的区别,唯一的区别是call传入的是参数列表,apply传入的是数组(记忆小技巧,apply和array都是a开头的,记住apply是数组)

bind()方法:生成一个新的函数,可以指定函数调用时的this对象和传参列表

var obj={

name:“joy”,

say:function (content,a,b) {

var say=function () {

console.log(this.name+’ say '+content)

};

say();

}

};

obj.say(“welcome”);

bind()方法因为是生成了一个函数,因此,如下示例:

var obj={

name:“joy”,

say:function (content,a,b) {

var say=function () {

console.log(this.name+’ say '+content)

};

var say1=say.bind(this); //需要新建一个say1,

say1();

console.log(say==say1); //say和say1并不相等,说明不是一个函数

}

};

obj.say(“welcome”);

传参数的方式和call相等用逗号隔开的参数

变量作用域简介

JS查找变量的过程:先查找局部作用域,再查找嵌套作用域(不一定有),再查找全局作用域,个人理解:还是就近查找,如果没有就往上一层查,一层一层往上;

在JS中作用域分为:局部作用域全局作用域局部作用域中的变量叫做局部变量全局作用域中的变量叫做全局变量

局部变量在每次执行函数的时候都会创建执行结束后销毁函数外不可访问

全局变量在所有代码中都可以访问和修改;

另外:局部变量中的变量名可以和全局变量中的相同,但是两者没有关系

在es6中引入了let,const,它们是声明块级作用域变量,块由{}组成

obj.say(“welcome”);

let x=10;

var y=10;

{

let x=5;

var y=5;

{

let x=2;

var y=2;

console.log(x+" "+y) //2 2

}

console.log(x+" "+y); //5 2

}

console.log(x+" "+y); //10 2

这边的let因为是块级变量,所以相互不守干扰,但是y就不行,受到了最里层的定义影响
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

前端面试题汇总


前端面试题是我面试过程中遇到的面试题,每一次面试后我都会复盘总结。我做了一个整理,并且在技术博客找到了专业的解答,大家可以参考下:

由于篇幅有限,只能分享部分面试题,完整版面试题及答案可以【点击我】阅读下载哦~

感悟

由于篇幅有限,只能分享部分面试题,完整版面试题及答案可以【点击我】阅读下载哦~

感悟

春招面试的后期,运气和实力都很重要,自己也是运气比较好,为了回馈粉丝朋友们(毕竟自己也玩了这么久哈哈哈),整理个人感悟和总结以上。最后祝愿大家能够收获理想offer!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值