目录
在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变
所有未定义(未var)直接赋值的变量自动声明为拥有全局作用域
①修改this的指向 ,改变执行环境上下文,将指向改变到obj
①修改this的指向 ,改变执行环境上下文,将指向改变到obj
函数的概念
函数允许封装一系列代码来完成特定任务,当想要完成某一任务时,只需要调用相应的代码即可。
方法(method)一般为定义在对象中的函数。
函数的作用
功能的封装,直接调用,代码复用率提高
函数的声明
1)常规声明
function 函数名(形参列表){
//函数体
//写在return后面的语句失效
}
2)函数表达式
var 函数名 = function(形参列表){
//函数体
}
这种形式看起来像常规的变量赋值,先创建一个匿名函数,然后赋值给变量函数名。
在JS中如果要想使用一个变量,必须先给这个变量赋值,所以函数表达式也不例外,在调用之前,必须先给它赋值,否则会报错。
3)函数声明提升
函数声明提升到代码的最前边,可以直接调用函数
函数的内部属性
只有在函数内部才能访问的属性(this也可以在函数外部进行使用)
1、arguments
arguments是一个类数组对象,专门用来保存实际参数列表,包含着传入函数中的所有参数。
arguments的属性:
1)callee属性
该属性是一个指针,指向拥有这个arguments对象的函数,仅当相关函数正在执行时才可以使用,可以用来做一个递归
2)length属性
指接受形参的个数,与实参的个数没有关系
2、this
面向对象语言中 this 表示当前对象的一个引用。
在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变
- 在方法中,this 表示该方法所属的对象。
- 如果单独使用,this 表示全局对象。node里是一个{ },浏览器里windows是全局对象
- 普通函数调用,this 表示全局对象。node--golbal,浏览器--windows
- 在事件中,this 指向接受事件的html元素。
作用域
函数作用域:在 JavaScript函数中声明的变量,会成为函数的局部变量,且在函数外部不能访问
全局作用域:函数之外声明的变量,会成为全局变量,且在函数内部可以访问
所有未定义(未var)直接赋值的变量自动声明为拥有全局作用域
当函数内部有变量a时,会产生局部作用域,外界全局作用域中的a不会对函数内部造成影响
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突
作用域链
自由变量:当前作用域没有定义的变量
自由变量的值如何得到:要到创建这个函数的那个父级作用域寻找,如果没有就一直向上级祖先元素寻找(这就是所谓的"静态作用域")
作用域链:如果父级也没呢?再一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃,这种一层一层的关系,就是作用域链
函数调用
1、函数名(实参列表);
函数名();//普通函数调用
new 函数名();//构造函数调用
2、函数名.call(执行环境对象,实参列表);
参数作用:
①修改this的指向 ,改变执行环境上下文,将指向改变到obj
②实参列表
3、函数名.apply(执行环境对象,实参列表数组);
参数作用:
①修改this的指向 ,改变执行环境上下文,将指向改变到obj
②实参数组
4、函数名.bind(执行环境对象)(实参列表);
bind方法返回的只是一个修改过后的函数
bind函数执行的方法:
1)bind函数直接带两个括号
2)新建一个变量c来接收bind修改后的函数,再执行c(这里c是一个函数)
5、总结
call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,根据自己的实际情况来选择使用,这是它们的区别。
回调函数
回调,就是回头调用的意思。主函数的事先做完,回头再调用当成参数传进来的那个函数。