this 的指向
this的指向是在我们调用函数的时候确定的,调用的方法不同决定了this的指向不同。
调用方法 | this指向 |
---|---|
普通函数 | window |
构造函数 | 实例对象,原型对象里的方法也是指向实例对象 |
对象方法 | 指向所属对象 |
事件绑定 | 绑定事件对象 |
定时器 | window |
立即执行 | window |
function foo(){
console.log("this",this);
}
//var arr = [1,2,3,foo];
//arr[3]();
[1,2,3,foo][3]();
//this 指向arr
call方法
call() 调用一个对象,可以改变函数的this指向
经常做继承:
var o = {
name: 'namenum'
}
function fn(a, b) {
console.log(this);
console.log(a+b)
};
fn(1,2)
fn.call(o,1,2)
apply 方法
apply() 方法调用一个函数,简单理解为调用函数的方式,也可以改变this指向
经常与数组有关
var o = {
name='abcd'
}
function fn(a,b){
console.log(this)
console.log(a+b)
}
fn();
fn.apply(o,[123,456])
bind 方法
bind 方法改变方法内部的this指向,但不执行,而是将改变后的函数作为返回值。需要用变量来接受这个返回值
function f1(name,age){
console.log(this)
}
var f2=f1.bind({})
console.log(f2)
// 按钮联系
<button> 发送 </button>
document.querySelector('button').addEventListener('click',function(){
this.disbled=true
seTimeout(fn.bind(this),3000)
})
function fn(){
console.log(this)
this.disbled = false
}
call、apply、bind三者的异同
共同点: 都可以改变this指向
不同点:
call、apply都可以调用函数,同时改变函数内部this指向
call、apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
bind 不会调用函数,返回值是个函数,也可以改变函数内部this的指向
call 经常做继承
apply 经常和数组一起用
bind 不想调用函数情况下修改this指向,改变定时器内部的this指向
严格模式:
严格模式可以应用到整个脚本或个别函数中。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况
脚本开启严格模式:
将整个脚本文件放在一个立即执行的匿名函数之中
<script>
"use strict"//当前script标签开启了严格模式
</script>
<script></script>
函数开始严格模式
要给某个函数开启严格模式,需要把“use strict”; (或 ‘use strict’; ) 声明放在函数体所有语句之前
function fn(){
"use strict";
return "123";
}
高阶函数
高阶函数是对其他函数进行操作的函数,接受函数为参数或者将函数作为返回值输出。
// 1)函数作为参数传递
// var a= function(){console.log('我是f1函数的参数');}
function f1(a, b) {
a()
b()
}
f1(function () {
console.log('aaaa');
}, function () {
console.log('bbbb');
})
// 函数作为另外一个函数的返回值
function f2() {
return function f3() {
console.log('f3');
}
}
var result = f2()
console.log(result);
result()
闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
function fn(){
var num = 10;
function fs(){
num++;
console.log(num);
}
fs()
}
fn()
闭包的作用:延伸变量的作用范围
function fn(){
var num = 10;
function fs(ass){
num+=ass;
console.log(num);
}
return fs(ass);
}
递归
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用
自己, 这个函数就是递归函数
递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack overflow),所以必
须要加退出条件return
练习:
利用递归求1~n的阶乘
function fn(num){
if(num==1){
return 1;
}
return num*fn(num-1);
}
console.log(fn(3));
用递归求斐波那契数列
function fb(num){
if(num===1 || num===2){
return 1;
}
return fb(num-1)+fb(num-2)
}
console.log(fb(3));