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指向  创建这个箭头函数所在对象 的上下文  


相关文章
|
14天前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
27 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
13天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
23天前
|
前端开发 JavaScript UED
探索JavaScript中的异步编程模式
【10月更文挑战第21天】在数字时代的浪潮中,JavaScript作为一门动态的、解释型的编程语言,以其卓越的灵活性和强大的功能在Web开发领域扮演着举足轻重的角色。本篇文章旨在深入探讨JavaScript中的异步编程模式,揭示其背后的原理和实践方法。通过分析回调函数、Promise对象以及async/await语法糖等关键技术点,我们将一同揭开JavaScript异步编程的神秘面纱,领略其带来的非阻塞I/O操作的魅力。让我们跟随代码的步伐,开启一场关于时间、性能与用户体验的奇妙之旅。
|
27天前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
29天前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
11天前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第33天】在JavaScript的世界里,异步编程是提升应用性能和用户体验的关键。本文将带你深入理解异步编程的核心概念,并展示如何在实际开发中运用这些知识来构建更流畅、响应更快的Web应用程序。从回调函数到Promises,再到async/await,我们将一步步解锁JavaScript异步编程的秘密,让你轻松应对各种复杂的异步场景。
|
1月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
32 4
|
1月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
16 2
|
1月前
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
23 5
|
1月前
|
JavaScript 前端开发
Node.js 函数
10月更文挑战第5天
23 3