0x00:js中this的四种调用模式

1,方法调用模式

2,函数调用模式

3,构造器调用模式

4,apply、call、bind调用模式

0x01:第一种:方法调用模式 (也就是用.调用的)this就是这个对象本身 

当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个方法被调用时,this被绑定到该对象,如果一个调用表达式包含一个属性表达式(即一个.点表达式或者[subscript]下标表达式)那么它被当做一个方法调用.

  1. var myObject = {
  2.    value:;
  3.    increment:function(inc){
  4.        this.value + = typeof inc === 'number'?inc:;
  5.    }
  6. }
  7. myObject.increment();
  8. document.writeln(myObject.value);//1
  9. myObject.increment();
  10. document.writen(myObject.value;)
方法可以使用this去访问对象,所以它能从对象中取得或修改该对象,this到对象的绑定发生在调用它的时候,这个超级“迟绑定”(very later binding)使用函数可以对this高度复用,通过this可取得它们所属对象的上下文的方法称为公共方法。  

0x02:第二种:函数调用模式 

当函数并非一个对象的属性时,那么它被当做一个函数来调用:

  1. var sum = add(,);
当函数以些模式调用时,this被绑定到全局对象,这是语言设计上的一个错误,如果语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this对象,这个错误设计的后果就是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权,有一个很容易的解决办法如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过这个变量来访问到this
  1. //给myObject增加一个double方法
  2. myObject.double = function(){
  3.    that = this;
  4.    var helper = function(){
  5.        that.value = add(that.value,that.value);
  6.    }
  7.    helper();以函数的形式来调用helper
  8. }
  9. //以方法的形式来调用double
  10. myObject.double();
  11. document.wtiten(myObject.getValue());//6

0x03:第三种:构造函数调用模式

  1. var Class = function(){
  2.    this.value = ;
  3. }
  4. var class = new Class();
  5. console.log(class.value); //100

我们通过new关键字来调用构造函数,此时this会绑定在该新对象上(也就是这个实例对象上)

0x04:第四种:apply和call以及bind的调用模式:指定绑定对象 

  1. var myObject = {value:};
  2. var foo = function(){
  3.    console.log(this);
  4. };
  5. foo(); //global
  6. foo.apply(myObject);//{value:100}
  7. foo.call(myObject);//{value:100}
  8. var newFoo = foo.bind(myObject);
  9. newFoo(); //{value:100}

apply()方法接受两个参数第一个是函数运行时的作用域,另一个是参数的数组(arguments)

call()方法第一个参数与apply是一样的,第二个参数需要一个个列举出来

call方法更接近我们平时调用函数,而apply需要我们传递 Array形式的数组做为参数,它们是可以相互转换的

js中this的四种使用方法的更多相关文章

  1. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  2. JS 中深拷贝的几种实现方法

    JS 中深拷贝的几种实现方法1.使用递归的方式实现深拷贝 //使用递归的方式实现数组.对象的深拷贝 function deepClone1(obj) { //判断拷贝的要进行深拷贝的是数组还是对象,是 ...

  3. stl中map的四种插入方法总结

    stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...

  4. js中this的四种调用模式

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. JS中常见的几种继承方法

    1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...

  6. js中index()的四种经典用法(转https://blog.csdn.net/superit401/article/details/51726826)

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  7. js中index()的四种经典用法111

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. JS中this的四种用法

    1.在一般函数方法中使用 this 指代全局对象 2.作为对象方法调用,this 指代上级对象 3.作为构造函数调用,this 指代new 出的对象 4.apply 调用 ,apply方法作用是改变函 ...

  9. JS中 this 的四种用法

    1.在一般函数中使用 this 指全局对象 window function fn(){ this.x = 1 } fn(); //相当于window.fn() 2.作为对象方法使用 this 指该对象 ...

随机推荐

  1. SQL Server数据库---》增删查改

    ***数据的插入:(增) insert into 表名(字段列表) values(值列表) 如果不写字段列表就要为表添加全部的列数据 其实into也可以省略 每次只能插入一条数据 1.如果字段可以为n ...

  2. SqlServer2008 数据库同步的两种方式 (发布、订阅)

    尊重原著作:本文转载自http://www.cnblogs.com/tyb1222/archive/2011/05/31/2064944.html 上篇中说了通过SQL JOB的方式对数据库的同步,这 ...

  3. ora-06502

    执行一个存储过程时报这个错误 ORA-06502: PL/SQL: 数字或值错误 发现是定义的字符串的缓冲区太小,赋给字符串的值又太大 修改varchar2(20)  →   varchar2(200 ...

  4. Temporary Post Used For Theme Detection (19f70e1d-5d8d-4c19-aef1-5b5a71ae0c47 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    This is a temporary post that was not deleted. Please delete this manually. (90462755-633b-4a0e-abb7 ...

  5. 关于debug和release 以及new 和delete

    题目:给出一组字符串 输入:"ate","eat","Eat","new","ENW",“wha” ...

  6. C/C++输入输出

    一. cin>>当碰到空格或换行符'\n'时,输入结束 该操作符是根据后面变量的类型读取数据. 输入结束条件 :遇到Enter.Space.Tab键. 对结束符的处理 :丢弃缓冲区中使得输 ...

  7. 在eclipse上安装 Marketplace Client

    Eclipse Marketplace是个插件应用商店,很实用的一个功能. 打开 eclipse,help--Eclipse Marketplace Client就能找到 有的eclipse中没有这个 ...

  8. 解决Ubuntu DNS解析慢、上网速度慢

    自从ubuntu升级到10.04后,上网速度感觉变慢了很多(ADSL),原因也众说分云,有说是firefox浏览器造成的,于是用chrome访问,速度依然很慢,可见不是由于浏览器造成的. 网速慢, 是 ...

  9. xsqlbuilder使用说明

    动态构造sql的利器:rapid-xsqlbuider详细说明 特性列表: 动态构造sql条件语句,提供sql拼接与使用占位符两种方式 数据类型的修饰 对SQL注入攻击的防范 问题: 手工构造SQL语 ...

  10. Bower —— 一个Web的包管理工具

    作者:江剑锋   github地址:https://github.com/bower/bower Bower为何物 Bower是一个Web开发的包管理软件.前端开发中,或多或少,都会以来于现成的fra ...