首页 > 其他分享 >函数的调用 以及“上下文”

函数的调用 以及“上下文”

时间:2023-07-01 13:00:15浏览次数:34  
标签:调用 console 函数 指向 window 上下文 fn log

函数的三种调用方式

  • 全局函数

//全局函数 this指向window 因为fn全局函数是window的一个属性
        function fn() {
            console.log(this);//window
        }
        // window.fn();
        fn();
  • 对象方法

 //对象的方法
        var p = {
            name: '张三',
            age: 15,
            sayHi() {
                console.log(this);//p对象
                console.log(this === p);//true
            }
        }
        p.sayHi();
        //将fn函数赋值给对象的sayHi
        p.sayHi = fn;
        p.sayHi();//此时执行fn中代码 this指向p
  • 构造函数

  //构造函数 new会做四件事 会将this指向new创建的对象
        function Stu(name, age) {
            this.name = name;
            this.age = age;
        }
        var s = new Stu('李四', 18);
        console.log(s);


        //普通函数 相当于window.Stu()调用  this是window 给window动态加属性
        var s1 = Stu('王五', 20);
        console.log(s1);//没有返回值 结果undefined
        console.log(name);//王五
        console.log(age);//20

总结

	this谁调用 this指向谁
	全局函数中 this指向window
	对象方法中 this指向对象
	构造函数中 this指向new创建的对象
	定时器中 this默认指向window

函数的上下文调用

  • 可以动态的修改this的指向

  • call

  • 语法 函数名.call(修改this的指向,arg1,arg2...)

function fn(a, b) {
            console.log(this);
            console.log(a + b);
        }
        fn(1, 2);//this指向window
        fn.call({ name: '张三' }, 10, 20);//修改后this指向这个对象
  • apply()

  • 语法 函数名.apply(修改this的指向,[arg1,arg2...])

  • 第二个参数是数组或伪数组 会自动遍历数组或伪数组的每一个元素给函数的形参赋值

function fn(a, b) {
            console.log(this);
            console.log(a + b);
        }
        fn(1, 2);//this指向window
        fn.apply([1, 2], [30, 40]);//修改后this指向这个数组 
  • bind()
  • 语法 函数名.bind(修改this的指向,arg1,arg2...)
  • bind()不会执行这个函数 而是会返回一个修改了this之后的新函数 然后再对这个新函数进行传参
function fn(a, b) {
            console.log(this);
            console.log(a + b);
        }
        fn(1, 2);//this指向window


        //bind与call不同的是 它不会执行这个函数 
        //而是会返回一个修改了this之后的函数
        //然后在堆返回的函数传参
        //bind一般用于回调函数中 如定时器
        var fn2 = fn.bind([2, 22, 222]);
        fn2(1, 11)


        //定时器的this默认指向window 可以用bind修改this的指向
        //匿名函数
        setTimeout(function () {
            console.log(this);
            //回调函数中修改this 此时this执行对象      
        }.bind({}), 2000);


        //表达式函数
        var test = function () {
            console.log(this);
        }
        setTimeout(test.bind([10, 20]), 1000);
  • 上下文调用模式三种语法的异同点

    • 相同点: 作用都是动态修改this的指向
    • 不同点传参方式不一样
  • 上下文调用模式三种方法 其实是属于Function构造函数的原型的 意味着js中所有的函数都能使用上下文调用修改this的指向

  • 修改的this只能是引用类型

​ 如果将this改为值类型 会自动转成基本包装类型

​ 如果将this改为undefined和null 程序不会报错 也不会修改 this依旧指向window

​ 如果没有传参 this依旧指向window

新的双冒号运算符

foo::bar;
//等同于
bar.bind(foo);

foo::bar(...arguments);
//等同于
bar.apply(foo, arguments);

标签:调用,console,函数,指向,window,上下文,fn,log
From: https://www.cnblogs.com/oOLzYOo/p/17519143.html

相关文章

  • WinPcap编程常用库函数
    PCAP常用库函数pcap_t*pcap_open_live(char*device,intsnaplen,intpromisc,intto_ms,char*ebuf)获得用于捕获网络数据包的数据包捕获描述字。device参数为指定打开的网络设备名。snaplen参数定义捕获数据的最大字节数。promisc指定是否将网络接口置于混杂模式......
  • HTTP调用:你考虑到超时、重试、并发了吗?
    今天,我们一起聊聊进行HTTP调用需要注意的超时、重试、并发等问题。与执行本地方法不同,进行HTTP调用本质上是通过HTTP协议进行一次网络请求。网络请求必然有超时的可能性,因此我们必须考虑到这三点:首先,框架设置的默认超时是否合理;其次,考虑到网络的不稳定,超时后的请求重试是一个......
  • 静态方法的引用 和 接口式函数
    使用 ::完成对方法的引用使用@FunctionInterface注解的函数表示接口式函数,接口式函数只能拥有一个抽象方法,可以拥有多个默认方法。person.classclassPerson{Stringname;Integerage;publicPerson(){}publicPerson(Stringname,Integerag......
  • python调用cmd显示中文乱码及调用cmd命令
    os.system('dir')解决方法加上os.system('chcp65001')_____________________________________________________________#!/usr/bin/python3#-*-coding:UTF-8-*-importosos.system('chcp65001')result=os.system(r"dir")ss="......
  • [GPT] Vue 的 methods 中使用了 addEventListener,如何在 addEventListener 的匿名函数
     在Vue的methods方法中使用addEventListener时,你可以使用 箭头函数 来访问Vue实例的数据。箭头函数不会创建自己的作用域,而是继承父级作用域的上下文。以下是一个示例: html<template><button@click="attachEventListener">ClickMe</button></template><s......
  • Mysql基础篇(二)之函数和约束
    一.函数Mysql中的函数主要分为四类:字符串函数、数值函数、日期函数、流程函数1.字符串函数常用函数如下:函数功能CONCAT(S1,S2,......Sn)字符串拼接,将S1,S2,.....Sn拼接成一个字符串LOWER(str)将字符串str全部转为小写UPPER(str)将字符串str全部转为大写......
  • feign远程调用服务降级处理
    当进行某一服务无法承受处理请求时,进行服务降级:服务降级是服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃服务降级虽然会导致请求失败,但是不会导致阻塞。 服务降级是一种应对系统故障或高负载情况下的......
  • laravel8配置全局公共函数步骤详解
    1.首先添加文件,app/Helpers.php,我这里是这个名字因为习惯了,你也可以自己定义<?phpif(!function_exists("getFileName")){/***从路径中获取文件名*@param$fileName*@returnstring*/functiongetFileName($fileName){$s......
  • clickHouse中实现类似lag和lead的函数
     clickhouse中的lead和lag实现有多种方法,在标准的SQL中使用的windowsfunction即可实现。示例数据:CREATETABLEllexample(gInt32,aDate)ENGINE=Memory;INSERTINTOllexampleSELECTnumber%3,toDate('2020-01-01')+numberFROMnumbers(10......
  • 函数跳转栈帧流程分析
    一个简单跳转过程的分析1.源代码如下#include<stdio.h>intsub(intd,inte){returnd-e;}intsum(inta,intb){intc=sub(100,9);returna+b+c;}intmain(void){inta=12;intb=98;intsum_result=sum(a,b);return0;......