javascript 之 call,apply原理
一、call原理
1、使用JQuery的call功能
var add(c,d){
return this.a+this.b+c+d
}
var obj={a:1,b:2}
add.Call(obj,3,4);
//结果: 10
观察:
var o={
a:1,
b:2,
add:function(c,d){
return this.a+this.b+c+d;
}
}
o.add(3,4);
2、原理分析
//先来看一下网上找的案例,建议跟着敲两边
var add(c,d){
return this.a+this.b+c+d
}
var obj={a:1,b:2}; Function.prototype.es6Call=function(context)
{
var context=context || window;
context.fn=this;
var args=[];
for (var i=1,len=arguments;i<len;i++){
args.push(arguments[i]);
}
return context.fn(...args);
} //调用
add.es6Call(obj,3,4); //结果:10
3、思考
在网上看到这样的一种语句
function fn1(){
console.log("这是FN1");
}
function fn2(){
console.log("这是FN2");
} //第一种:
fn1.es6Call(fn2); //结果: 这是FN1
分析:this本身指向的是fn1,fn1本身就是一个函数方法,那么就确定context.fn=fn1,所以无论是否有其他参数,那么都会执行fn1这个函数
//第二种:
fn1.es6Call.es6Call(fn2); //结果: 这是FN2
分析:在调试过程中,context 指向的是 fn2, 但是 context.fn=this(此时,this就是 fn1.es6Call)这句话,让context.fn(...args) 返回值为undefine,也就是说this=fn.es6Call只是指向Funtion.prototype.es6Call本身,仅仅表示对象 //有人会想,执行 fn1.es6Call().es6Call() //结果:报错
javascript 之 call,apply原理的更多相关文章
- JavaScript中new实现原理
JavaScript中new实现原理 1.创建一个空对象 obj 2.将该对象 obj 的原型链 __proto__ 指向构造函数的原型 prototype, 并且在原型链 __proto__ 上设置 ...
- 由浅入深,带你用JavaScript实现响应式原理(Vue2、Vue3响应式原理)
由浅入深,带你用JavaScript实现响应式原理 前言 为什么前端框架Vue能够做到响应式?当依赖数据发生变化时,会对页面进行自动更新,其原理还是在于对响应式数据的获取和设置进行了监听,一旦监听到数 ...
- javascript call与apply关键字的作用
apply接受两个参数.第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合. call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数. 1 2 3 4 ...
- JavaScript实现DDoS攻击原理,以及保护措施。
DDos介绍 最普遍的攻击是对网站进行分布式拒绝服务(DDoS)攻击.在一个典型的DDoS攻击中,攻击者通过发送大量的数据到服务器,占用服务资源.从而达到阻止其他用户的访问. 如果黑客使用JavaSc ...
- JavaScript中的计时器原理
理解John Resig 在 How JavaScript Timers Work. 原理分析 timer(setInterval,setTimeout)有一个很重要的概念,时间延迟的长短是不稳定的. ...
- 《JavaScript总结》apply、call和bind方法
在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...
- javascript中call,apply,bind的用法对比分析
这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习java ...
- JavaScript定时器的工作原理(翻译)
JavaScript定时器的工作原理(翻译) 标签(空格分隔): JavaScript定时器 最近在看ajax原理的时候,看到了一篇国外的文章,讲解了JavaScript定时器的工作原理,帮助我很好的 ...
- JavaScript 中 this 的原理
一.问题 学习 JavaScript 其中一个标志就是理解下面两种写法,会输出有不一样的结果. var obj = { foo: function () {} }; var foo = obj.foo ...
随机推荐
- jenkins用户和权限管理
添加用户 进入管理界面,选择manage users,添加用户 将人和角色绑定 用户和项目绑定 角色管理 可以针对不同的站点对不同的人赋权 添加角色并赋权 将角色赋权给对应的用户 使用新添加的这个用户 ...
- sqllite 学习-1
C# SQLite 数据库操作学习: https://www.cnblogs.com/leemano/p/6578050.html SQLite 之 C#版 System.Data.SQLite 使用 ...
- py文件单独调试django ORM的配置
1.新建一个py文件 2.代码环境搭建 import os if __name__ != '__main__': exit() # 加载django项目的配置信息 os.environ.setdefa ...
- 查看所使用的Linux系统是32位还是64 位的方法
方法一:getconf LONG_BIT # getconf LONG_BIT 1 1 我的Linux是32位!!! 方法二:arch # arch 1 1 显示 i686 就是32位,显示 x86_ ...
- jenkins-不能启动
FROM centos RUN docker run -tdi --privileged centos init ADD jdk-8u171-linux-x64.tar.gz /usr/local A ...
- vue项目开发优化
1 按需引入ui组件 比如elementUI,不要直接在main.js中全局引入所有的组件,可以根据elementui的说明文件,按需引入 项目中的组件 2 异步引入路由组件 使用 { path:'/ ...
- axios发post请求,后端接收不到参数的问题
axios会帮我们自动转换请求数据和响应数据 以及 自动转换JSON数据,我们的请求头转换成 Content-Type变成了application/json;charset=utf-8,然后因为我们的 ...
- python:动态参数*args
动态参数 顾名思义,动态参数就是传入的参数的个数是动态的,可以是1个.2个到任意个,还可以是0个.在不需要的时候,你完全可以忽略动态函数,不用给它传递任何值. Python的动态参数有两种,分别是*a ...
- Nginx负载均衡-如何自定义URL中的hash key2
upstream backend1 { server 192.168.3.236:555; server 192.168.3.236:222; ...
- 乐字节Java继承|方法重写、super和final关键字
大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...