函数
引用数据类型
1)函数的作用
特定功能代码的封装
用来创建对象(构造函数=>Object,Array)
2)函数的定义
函数声明(函数的声明会提升)
关键字 函数名(形式参数){
函数体
返回值
}
function add(a,b){ //【具名函数】
console.log(a+b)
return a+b
}
函数表达式
var add = function(){函数体;返回值} //【匿名函数】
var a = 1
var o = {}
3)函数的调用
函数名(实际参数)
window.add()
global.add()
函数名.call(obj,参数列表)
obj => this
call => 可以接受无数个参数
函数名.apply(obj,[参数数组])
obj => this
apply => 只能接受两个参数
4)函数的作用域
在函数内部定义的变量,在函数外部访问不到
在函数外部定义的变量,在函数内部可以访问,这个变量和这个函数就组成了闭包
在函数内部不存在局部作用域
function test(){
if(true){
var a = 1
}
console.log(a) //a = 1
}
function test(){
function inner(){
if(true){
var a = 1
}
}
inner()
console.log(a) //a = 1
}
如何在函数中定义一个局部变量
let
立即执行函数
(function(){
console.log(999)
})()
5)函数在内存中的表现形式
6)函数内部属性
形式参数只是接受参数的快捷方式,实际的参数保存在arguments中
参数
function add(a,b){
console.log(a,b)
}
add(1,2,3,4)
arguments
类数组对象,参数实际保存的地方
[1,2,3,4,5]
{0:1,1:2,2:'tom'}
this
this的取值和调用它的对象有关,哪个对象调用它,namethis就指向那个对象
观察函数名前面有没有对象,如果有对象,那么this指向该对象
如果.前面没有对象,this指向全局对象(global,window)
指定this
函数名.call(obj,)
函数名.apply(obj,)
7)函数作为值,函数作为参数,函数作为返回值
var a = 值
函数作为值
var a = 3
var add = function(){}
var add1 = add
函数作为参数(回调函数)
test(1,2,function(){})
arr.forEach(function(){})
函数作为返回值
function add(){
return function add1(){
}
}
var a add ()
console.log(a) => 函数
8)值传递和引用传递
var a = 2
var b = a
b = 10
var add = function(){}
var add1 = add