函数的相关问题

1.函数:

在js中,使用Function可以实例化函数对象,也就是说在js中,函数与普通对象一样,也是一个对象类型
函数的特点:
1.函数是对象,可以使用对象的动态特征
2.函数是对象,就有构造函数创建对象
3.函数是函数,可以创建其他对象
4.函数是唯一可以跟定变量作用域的结果

2.函数的构造函数(Function)

使用Function创建函数(函数是Function的实例)
语法:new Function(arg1,arg2,arg3…) --Function中的参数是全是字符串
作用:

  1. 将参数连接起来,组成函数
  2. 如果参数只有一个,则表示参数体
  3. 如果参数有多个,则最后一个表示参数体,前面所有参数表示函数的参数
  4. 如果没有参数,则创建一个空函数

3.argument对象

在js中,定义函数时,若不写参数,一样可以调用传递参数,若写了参数,调用时可以不传参,若定义时写了一个参数,调用时可以随意的传递多个参数。则函数并没有规定必须如何传参,在调用过程中,没有规定参数的个数与类型,因此,函数在调用构成具有灵活性,为了方便,在每个函数调用过程中,函数代码没有一个默认对象arguments,它是个伪数组存储着实际传入函数的所有参数

function addname(){
    var allname='';
    for(var  i=0;i<arguments.length;i++){
        allname+=arguments[i];
    }
    return allname;
}
console.log(addname('mary','tom','lucy'));

4.函数的原型链结构

任何函数都是相当于Function的实例,类似于{}与new Object()的关系,即函数应该继承自Function.prototype
函数原型链结构为
Function->Function.prototype->Object.prototype->null

5.关于this

a.this指向的对象称为函数的上下文,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,一般来说,this指向的是那个最后调用它的对象。
b.this指向取决与函数被调用的方式
***如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window
***处于构造函数中,this用来表示实例对象
***处于对象中,this指向方法运行时所在的对象
c.this指向的改变
***new关键字、apply()、call()、bind()

6.普通函数和箭头函数的区别:

a.箭头函数不能作为构造函数,不能使用new
b.箭头函数没有原型属性,所以箭头函数本身没有this,箭头函数的this指向在定义的时候外层第一个普通函数的this(若外层函数的this发生改变,箭头函数的this也会改变)

function add(){
	()=>{
		console.log(this);//箭头在add中定义,则这里的this继承自add函数的this,而add函数的this与他的调用者有关。
	}
}
add();//这里在全局中调用add,则这里的this指向window

c.不能直接修改箭头函数的this指向,若要修改,只能修改被继承的普通函数的this指向
d.在全局调用中,箭头函数在严格模式和非严格模式下都指向windows,而普通函数在严格模式下,this指向undefined
e.若箭头函数的this指向window时,使用arguments会报未声明错误。若箭头函数的this指向普通函数,使用arguments时,arguments继承于该普通函数。

function addname(){
    let a=()=>{
        var allname='';
        for(var i=0;i<arguments.length;i++){
    allname+=arguments[i];
}
console.log(allname);
}
a();
}
addname('mary','tom','lucy');//arguments指向addname的参数数组

f.rest代替arguments用来获取箭头函数多余的参数,但是rest在普通函数和箭头函数中都 可使用,
********关于rest:
***rest是个数组可以使用数组的API,而arguments是伪数组,要使用数组的API是,必须使用扩展符Array.from来将它转换成真正的数组
***rest必须在参数的最后面
***函数的length属性不包括rest参数
g.箭头函数不支持重命名函数参数,普通函数的函数参数支持重命名
h.**关于new.target(一般用在构造函数之中,返回new命令作用于的那个构造函数。如果构造函数不是通过new命令或Reflect.construct()调用的,new.target会返回undefined)
箭头函数的this指向普通函数,它的new.target就是指向该普通函数的引用。若箭头函数的this指向全局对象,使用new.target会报错
i.当箭头函数只有严格参数时,可以省略括号-》var f = a => a;
当箭头函数只有一条语句时,可以省略{}和return-》
var f = (a,b,c) => a; // 传入a,b,c 返回a
j.箭头函数不能当做Generator函数,不能使用yield关键字

你可能感兴趣的:(javascript)