js中可以改变作用域的三种方式(改变this)

第一种方式:使用apply()方法: 

function sum(x, y) {
 alert(this); return x + y;//这里的this指的是callS对象方法
}
function callS() {
callS.callSum1(1, 2);
}
callS.callSum1 = function (x, y) {
 alert(this);//这里的this是callS方法
var s = sum.apply(this, arguments);
return s;
}
 callS();

第二种放方法:使用call()方法: 

有关call方法:

window.color="red";
var o ={color:"blue"};
function sayColor(a,b){alert(this.color);}
sayColor();//red
sayColor.call(this,1,2);//red
sayColor.call(window,1,2);//red
sayColor.call(o,1,2);//blue  

l在使用call()方法时,必须明确地传入每一个参数。结果和apply一样。
其实apply和call真正的强大用途在于,能够扩充函数赖以运作的作用域:

这样扩充的最大好处,就是对象不需要与方法有任何耦合关系。
 第三种方法:使用new关键字:

function Person(name,age){
  this.name=name;
  this.age=age;  this.sayName=function(){alert(this.name);};
}
var p1 = new Person("james",27);
var p2 = new Person("coook",24);
p1.sayName(); p2.sayName();
lnew关键字:
0开辟堆空间 1创建对象;2将构造函数作用域赋值给新对象(this就指向了该新对象);3执行构造函数中的代码(为新对象添加属性);4返回新对象
 
时间: 2024-12-19 00:37:30

js中可以改变作用域的三种方式(改变this)的相关文章

js中的事件绑定的三种方式

1 直接在html标签中绑定 <button onclick = "show()"></button> 注意当你引用的js代码是包裹在window.onload中的形式的时候,show()是会报没有定义的错误,原因在于window.onload是在 页面全部加载完之后再去解析加载里面的内容.而button的点击事件在解析button的时候没有被定义. 2 用js的对象进行绑定事件 <body> <buttonid="btn1"

cocos2d 中加入显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)

在 cocos2d 中有三个类能够在层或精灵中加入文字: CCLabelTTF CCLabelBMFont CCLabelAtlas      CCLabelTTF CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OPENGL 纹理将会被创建..这意味着setString 和创建一个新的标签一样慢. 所以,当你须要频繁的更新它们的时候,尽可能的不用去使用标签对象.  而应该使用CCLabelAtlas或者是CCLabelBMFont. OK, 看下它的用法 CC

JSP中设置Session有效时间的三种方式

JSP中设置Session有效时间的三种方式 2010-08-03 10:02:49|  分类: Java Web|举报|字号 订阅 (1)在主页面或者公共页面中加入: HttpSession session=request.getSession(true); session.setMaxInactiveInterval(900);参数900单位是秒,即在没有活动15分钟后,session将失效.这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端.所以如果是在调试程序,应该

.net 中dapper实现事务的三种方式总结

.net 中实现事务查询的三种方式 1.TransactionScope  通过创建TransactionScope  对象然后包裹connection对象执行相关查询操作,完成 此种方式可以用于分布式事务操作,当链接不同数据库时,通过简单配置可以实现不同数据库的事务操作,当使用单机查询时(即只有一个数据库并且与应用服务器在同一台电脑时,不需要做额外配置) 2.通过connection 对象 BeginTransaction方法 创建,然后执行查询方法是都带上 transaction对象来实现

spring中创建bean对象的三种方式以及作用范围

时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数函数,则对象无法创建. <bean id="one" class="sdnu.machi.one"></bean> 如果one.class中没有默认构造函数则会报

Linux中设置服务自启动的三种方式

有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0-6七个运行级别之一) chkonfig                命令行运行级别设置 ntsysv                   伪图形运行级别设置 注意:1.这三种方式主要用于以redhat为基础的发行版 2.如果还不知道运行级别是什么,那么最

Java中 实现多线程成的三种方式(继承,实现,匿名内部类)

------------------------------------------------------------------------------------------------------------ /** 第一种方式:继承Thread类 *             1. 定义一个类,然后让该类继承Thread类 *             2. 重写run方法 *             3. 创建定义的这个类的对象 *             4. 启动线程 */ //继承

android中填充界面布局的三种方式

改变原来界面布局的三种方式: 1.第一种方式: LayoutInflater li = LayoutInflater.from(this); 具体代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activ

[转]Linux中设置服务自启动的三种方式

from:http://www.cnblogs.com/nerxious/archive/2013/01/18/2866548.html 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0-6七个运行级别之一) chkonfig                命令行运行级别设置 ntsysv