基本概念:一段javascript代码,定义一次,执行或调用任意次。
其中,函数声明语法存在函数提升,类似于变量提升,将函数名提升在最上面。调用的时候会在全局找对应的函数体。但是函数表达式不可以,必须在定义函数后才可以使用。
function definition(param1,params2){
function body
}
let functionName = function(param1,param2){
return xxx
}
let mul = (param1,param2) => param1*param2; // mul(1,2)调用、返回2
let mul = (param1,param2) => {
return param1*param2
}
let f1 = () =>{
// f1()调用
console.log("arrow function")
}
let f2 = x => x**2;// f2(2)调用
let xx = ((x) => x**x)(4)//立即执行函数,x的值为4,输出256
let sum = new Function(){
"num1",
"num2",
"let result+=num1+num2;return result;"
}
如:sum(1,2,3+3,getnum())
在一个函数的调用中,每个参数表达式都会计算出一个值,计算的结果作为参数传递给另外一个函数。如果该函数返回是因为解释器到达结尾,那么该函数返回的值就是undefined。如果函数返回是因为函数执行到一条return语句,返回值就是return后面的表达式,如果只有return,没有表达式,那么返回undefined。所以函数有开始就应该有个结束。
let call = {
calling:function(){
console.log(" I'am iron man ")
}
}
由于方法是某个特定对象调用的函数,所以一定要在方法调用前加上对象名和符号 ’ . ’ ,这样才能标志这个函数是属于哪个对象的专属方法。如果你不加对象名,它就会报 calling is not defined,私人的东西别人是用不了的,所以报错没有定义。
函数在调用时,由于this没有作用域限制,所以在函数嵌套函数的时候,嵌套的函数不会从调用它的函数中继承上个函数体中的this。举例如下:
let obj = {
x:10,
fn:function(){
this.x++;
function ff(){
console.log(this.x)
}
ff()
}
}
obj.fn()
我们在调用的fn函数中,嵌套ff函数,在执行时先执行fn函数,将x的值+1,这个时候可以使用this.x来访问,因为obj是函数fn的直接调用对象,fn函数中的this=>obj,在fn中调用ff,这个时候ff的this就指向的是全局了,因为它没有直接对象来调用它,如果在浏览器中,这个this就是window,如果在node环境中,这个this就是global了。
那么如何处理这个问题呢。我们可以将fn中的this保存为一个变量,利用该中间件,在嵌套函数中使用,操作,也就间接地利用了同一个this。
function Car(name) {
console.log(this)//Car{}
this.name = name;
return null;
}
Car("tom") //null
new Car("tom") //object
构造函数在我们生活中是非常常见的,比如Array、Number、String等等。
let obj1 = {
x:1,
y:2,
add:function(m=1,n=1){
return this.x*m+this.y*n
}
}
console.log(obj1.add())// 这是obj1自己调用自己的函数
let obj2 = {
x:2,
y:3
}
console.log(obj1.add.call(obj2))//这是obj2利用了obj1的方法。返回5
console.log(obj1.add.call(obj2,100,1))//将100赋值给m,1赋值给n,x,y还是obj2自己的。