JavaScript 进阶第六章(this与函数的调用模式 )

简介: JavaScript 进阶第六章(this与函数的调用模式 )

根据函数内部this的指向不同,可以将函数的调用模式分成4种


  1. 函数调用模式


  1. 方法调用模式


  1. 构造函数调用模式


  1. 上下文调用模式(借用方法模式)


函数调用模式


如果一个函数不是一个对象的属性时,就是被当做一个函数来进行调用的。此时this指向了window


function fn(){
  console.log(this); // 指向window 
}
fn();


方法调用模式


当一个函数被保存为对象的一个属性时,我们称之为一个方法。当一个方法被调用时,this被绑定到当前对象

const obj = {
  sayHi:function(){
    console.log(this); // 在方法调用模式中,this指向调用当前方法的对象。
  }
}
obj.sayHi();


构造函数调用模式


如果函数是通过new关键字进行调用的,此时this被绑定到创建出来的新对象上。


function Person(){
  console.log(this);
}
Person(); // 指向window 
var p = new Person(); // this指向Person


上下文调用模式


也叫上下文模式,分为 apply 与 call


call


call方法可以调用一个函数,并且可以指定这个函数的this指向


  const RichWumon = {
      name: "海海",
      say: function () {
        console.log(this.name, " 你好呀");
      }
    }
    const obj = {
      name: "小陈"
    }
    RichWumon.say();            // 海海
    RichWumon.say.call(obj);    // 小陈

 

call应用


将伪数组转成数组

let divs = document.querySelectorAll('div');
    console.log(divs);
    function change(nodelist) {
        console.log(Object.prototype.toString.call(nodelist));
        return Array.prototype.slice.call(nodelist);
    }


apply


就是apply()方法接受的是一个包含多个参数的数组。而call()方法接受的是若干个参数的列表


    const RichWumon = {
      name: "海海",
      say: function () {
        console.log(this.name, "你好呀");
      }
    }
    const obj = {
      name: "小陈"
    }
    RichWumon.say();      // 海海
    RichWumon.say.apply(obj); // 小陈

 

apply应用


1.简化 console.log方法


// 简化log方法
    function log() {
        console.log.apply(console, arguments);
    }


bind方法


bind()方法创建一个新的函数, 可以绑定新的函数的this指向


var name = '海海';
function Fn(){
    this.age = 18;
    console.log(this.name + this.age);
}
Fn();     // 海海 18
// 返回值:新的函数
// 参数:新函数的this指向,当绑定了新函数的this指向后,无论使用何种调用模式,this都不会改变。
let obj = {
    name:'小陈',
}
const newFn = Fn.bind(obj);
newFn();    // 小陈 18


this的指向


单独使用,this 指向全局对象


console.log(this); // window


函数中的 this 指向全局对象  


function show(){
      console.log(this);  // window
    }
    show();


在函数内部,this 的指向在函数定义的时候是不能确定的,只有函数执行的时候才能确定  


const a = 18;
    const obj = {
      a: 19,
      b: {
        a: 20,
        c: function () {
          console.log(this.a);  // 20
        }
      }
    }
    obj.b.c();


在方法中,this 指代该调用方法的对象  


const obj ={
    name:"海海",
    say:function(){
        console.log(this);        // {name:"海海"}
    }
}


箭头函数中的this指向


箭头函数自己没有this

箭头函数的this是确定的,且不变

箭头函数中的this指向  创建这个箭头函数所在对象 的上下文  


相关文章
|
11天前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
|
2天前
|
前端开发 JavaScript 数据处理
在JavaScript中,异步函数是指什么
【5月更文挑战第9天】JavaScript中的异步函数用于处理非立即完成的操作,如定时器、网络请求等。它们可通过回调函数、Promise或async/await来实现。示例展示了如何使用async/await模拟网络请求:定义异步函数fetchData返回Promise,在另一异步函数processData中使用await等待结果并处理。当fetchData的Promise解析时,data变量接收结果并继续执行后续代码。注意,调用异步函数不会阻塞执行,而是会在适当时间点继续。
8 0
|
2天前
|
自然语言处理 JavaScript 前端开发
在JavaScript中,this关键字的行为可能会因函数的调用方式而异
【5月更文挑战第9天】JavaScript中的`this`关键字行为取决于函数调用方式。在非严格模式下,直接调用函数时`this`指全局对象,严格模式下为`undefined`。作为对象方法调用时,`this`指向该对象。用`new`调用构造函数时,`this`指向新实例。通过`call`、`apply`、`bind`可手动设置`this`值。在回调和事件处理中,`this`可能不直观,箭头函数和绑定方法可帮助管理`this`的行为。
8 1
|
2天前
|
JavaScript 前端开发 网络架构
JavaScript中的箭头函数是一种新的函数表达形式
【5月更文挑战第9天】JavaScript的箭头函数以简洁语法简化函数定义,其特性包括:1) 不绑定自身this,继承上下文的this,适合回调和事件处理;2) 没有arguments对象,需用剩余参数语法访问参数;3) 不能用作构造函数,无new调用;4) 没有prototype属性,不支持基于原型的继承。箭头函数在特定场景下优化了this处理,但使用时要注意与普通函数的差异。
6 2
|
4天前
|
JavaScript 前端开发
深入探索JavaScript:如何改变this的指向
深入探索JavaScript:如何改变this的指向
|
4天前
|
JavaScript 前端开发
js的一些内置函数
js的一些内置函数
7 1
|
4天前
|
JavaScript 前端开发 索引
js的includes函数
js的includes函数
10 1
|
4天前
|
JavaScript 安全 前端开发
js的map函数
js的map函数
7 0
|
4天前
|
JavaScript 前端开发
js的filter函数
js的filter函数
8 1
|
4天前
|
JavaScript 前端开发
js的函数
js的函数
6 0