函数的学习

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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值