当前位置: 首页 > news >正文

arguments、this指针、call和apply、bind语法

arguments、this指针、call和apply、bind语法

1、arguments

  • arguments是函数中被注入的一个参数,存储该函数在运行时接收到的参数
  • 可以使用索引的方式读取每一个参数值
  • arguments每个参数都可以修改
  • arguments拥有callee属性和length属性。(callee属性指向函数自身。而length属性获取参数个数)
  • 当arguments指向索引的值被修改后,函数对应的形参值也将会发生修改。
function fn(a,b,c){
    console.log(arguments.callee);
    arguments[0]="1234";
    console.log(a);
}
fn(1);//1234
fn(2,null,3);//1234
fn({a:123},'b');//1234
fn('a','b','c');//1234

2、this指针

  • 函数的调用者是谁,那么this指针指向谁
  • 如果没有声明函数的调用者,那么this指针指向window对象。
  • 实例化出来的对象,内部的this指针指向实例化对象

例子1

    var obj = {
      length : 10,
      method : function(){
         function temp(){
           console.log(this);
           console.log(this.length);
         }
         temp();
         //console.log(this.length);
      }
      }
    obj.method();

代码运行之后的结果如下:
输入图片说明
例子2

    var a = function(){
        this.num = 100;
    } 
    var na = new a();
    console.log(na.num);

代码运行后的结果如下:

吗

3、call和apply

  • 是调用函数的一种方法
  • call给被调函数传递参数时,从第二个参数算起使用逗号分隔
  • apply给别调用函数传递参数时,从第二个参数算起,但是第二个参数需要是个数组,把所有参数放到该数组中传递。
    function sum(a,b){
      return a+b;
    }
    //console.log(sum(10,20));
    sum(10,20);
    //var result = sum.call(null,10,20);
    var result = sum.apply(null,[10,20]);
    console.log(result);

代码运行的结果如下:

输入图片说明

  • 当call和apply的第一个参数是null时,sum函数内部的this指针都指向window对象
  • 当call和apply的第一个参数是一个对象A时,那么sum函数内部的this指针指向的是该参数对象A
  • 同样的参数条件下,call和apply仅仅修改函数内部的this指针,如果运算过程中不读取this上的属性时,这两种调用方法不会影响最终结果
    sum(10,20);
    var result = sum.call(null,10,20);
    var result = sum.apply(null,[10,20]);
    var obj = {
       username:‘abcde’
    };
    var result = sum.call(obj,10,20);

结果:

输入图片说明

4、bind语法

bind语法即是指将函数的this指针指向一个固定对象,即使使用call和apply修改this指针也是无法修改的

bind最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值。常见的错误就像上面的例子一样,将方法从对象中拿出来,然后调用,并且希望this指向原来的对象。一般不做处理,一般会丢失原来的对象。使用bind()方法能够很漂亮的解决这个问题。

  • bind就是在改变指针之后不执行函数
  • call和apply执行函数

例子1

    function sum(a,b){
       console.log(this);
       var result = a+b;
       console.log(a+b);
    }
    var obj = {
       username:'abcde'
    }
    var nsum = sum.bind(window);
    nsum.apply(obj,[10,20]);

代码结果:

输入图片说明

例子2

this.num = 9; 
var mymodule = {
  num: 81,
  getNum: function() { return this.num; }
};

mymodule.getNum(); // 81

var getNum = mymodule.getNum;
getNum(); // 9, 因为在这个例子中,"this"指向全局对象

// 创建一个'this'绑定到mymodule的函数
var boundGetNum = getNum.bind(mymodule);
boundGetNum(); // 81

转载于:https://www.cnblogs.com/hixxcom/p/7158200.html

相关文章:

  • ubuntu修改主机名
  • SSH设置不输入密码登陆方式
  • vb编程代码大全
  • ubuntu安装配置hadoop和hive
  • 励志
  • C#时间操作类
  • BZOJ 3437 小P的牧场(斜率优化DP)
  • Python+selenium网页模拟操作-自动化
  • oracle模糊查询(二)
  • java Web面试题
  • oracle模糊查询:全文索引方式(三)
  • oracle模糊查询:分区局部全文索引方式(四)
  • 动态链接及静态链接
  • BTrace实战
  • windows下安装配置hadoop
  • Java|序列化异常StreamCorruptedException的解决方法
  • java8-模拟hadoop
  • Java新版本的开发已正式进入轨道,版本号18.3
  • java中的hashCode
  • Mysql数据库的条件查询语句
  • node.js
  • ReactNative开发常用的三方模块
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Theano - 导数
  • 阿里云购买磁盘后挂载
  • 程序员该如何有效的找工作?
  • 欢迎参加第二届中国游戏开发者大会
  • 缓存与缓冲
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一文看透浏览器架构
  • 怎样选择前端框架
  • UI设计初学者应该如何入门?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #QT(智能家居界面-界面切换)
  • #单片机(TB6600驱动42步进电机)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (python)数据结构---字典
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (四)c52学习之旅-流水LED灯
  • (一)Thymeleaf用法——Thymeleaf简介
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Reactor简单使用教程
  • .Net 中Partitioner static与dynamic的性能对比
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /var/log/cvslog 太大
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @RequestBody详解:用于获取请求体中的Json格式参数