this的值

  • 在面向对象的编程中,this值很重要,且它的值取决于调用的模式
  1. 方法调用模式:this被绑定到该对象

    1   var name = "outer";
    2   var myObj = {
    3       name : "inner",
    4       getName : function () {
    5           return this.name;
    6       }
    7   };
    8   console.log(myObj.getName());   //inner,this指向myObj
  2. 函数调用模式:this被绑定到全局对象

     1   var name = "outer";
     2   var myObj = {
     3       name : "inner",
     4       getName : function () {
     5           return function(){
     6               return this.name;
     7           };
     8       }
     9   };
    10   console.log(myObj.getName()());  //outer,this指向window

    解决办法为

     1 var name = "outer";
     2   var myObj = {
     3       name : "inner",
     4       getName : function () {
     5           var that = this;
     6           return function(){
     7               return that.name;
     8           };
     9       }
    10   };
    11   console.log(myObj.getName()());  //inner
  3. 构造器调用模式:在函数前面使用new来调用,会创建连接到该函数的prototype属性的新对象,this会绑定到这个新对象上

    1   function Dog (color) {
    2       this.color = color;
    3   }
    4   Dog.prototype.getColor = function (){
    5       return this.color;
    6   };
    7   var dog = new Dog("yellow");  //this绑定到dog上
    8   console.log(dog.getColor());  //yellow
  4. Apply/Call调用模式:函数拥有这两个方法,允许我们选择this的值

     1   var name = "outer";
     2      var myObj = {
     3        name : "inner",
     4        getName : function () {
     5            return this.name;
     6        }
     7    };
     8
     9    console.log(myObj.getName());   //inner,this指向myObj
    10    console.log(myObj.getName.apply(window));   //outer,this指向window

    总结:在调用函数时,对参数this及arguments的搜索不遵守作用域链规则

时间: 2024-08-29 07:04:26

this的值的相关文章

easyui-textbox 和 easyui-validatebox 设置值和获取值

表单作如下定义:该input使用easyui的"easyui-textbox" 1 <input id="addSnumber" style="width: 200px; height: 30px;" class="easyui-textbox" type="text" name="snumber" data-options="required:true, missing

Matlab - 求数组的零值与过零点索引

function zeroindex=pickzero(x)%找出数组的零值及过零点(正负相交处,可能偏离0)m = length(x);x1=x(1:m-1);x2=x(2:m);indz = find(x==0); %zero pointindzer = find(x1.*x2<0); %negative/positiven=length(indzer);for i=1:n if abs(x(indzer(i)))>abs(x(indzer(i)+1)) indzer(i)=indzer(

spring @Value 设置默认值

@Value 的作用不用说 大家都知道 注解模式下 读取配置文件 注入属性值 /** * MQ地址 */ @Value("${NamesrvAddr}") private String namesrvAddr;   上面的是一个标着的 @Value 注解 如果配置文件中没有设置 NamesrvAddr Spring 在启动的时候讲报错. 设置默认值很简单 @Value("${NamesrvAddr:192.168.0.1}") private String name

django 数据库获取值

数据库表中的内容如下: models.Step_Type.objects.values()获取model中的符合条件的值, 实际为把表中的所有值都查询出来,如查询结果为:<QuerySet [{'id': 1, 'step_type': '注释'}, {'id': 2, 'step_type': '调用'}, {'id': 3, 'step_type': '日志'}]> models.Step_Type.objects.values().filter(id=1)[0] 获取符合条件的第一个值

Android-------ListView列表中获取EditText输入的值

最近项目的购物车中用列表中包含了留言功能, 需要获取EditText输入的内容,当购买多件商品时,就有点棘手了. 经过查资料解决了这个功能,并写了一个案例: 效果图: 可以在商品数据用一个字段来管理留言数据,这样就可以方便的操作了. 代码: public class MainActivity extends AppCompatActivity { ListView listView; @Override protected void onCreate(Bundle savedInstanceSt

值不能为null.参数名: viewInfo,如何解决

有蓝队网络服务器租用客户反映在一台服务器上使用数据库管理工具时弹出了如下错误 :值不能为null.参数名: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer 错误信息如上图: 解决方法:点击确定 登陆上去.查看---已注册的服务弹出报错信息,点详细. 会找到一个类似无法读取C:\Users\www.landui.com\AppData\Local\Temp\3\xx.tmp 的报错信息. 打开对应目录C:\Users\www.

SpringMVC加载.roperties文件属性值的方法?

1.在xml文件中引入来获取属性值就不说了. 2.在controller层获取引用配置文件中的属性值: (1).编写工具类 @Configuration @PropertySource(value="classpath:config.properties") public class Config { @Value("${gnss.server.url}") public  String GNSS_SERVER_URL; @Value("${gnss.se

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q

JAVA中只有值传递

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:"引用传递!",并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟

stl中的transform()注意其与for_each的不同点(有无返回值)

#include<iostream> using namespace std; #include"vector" #include"algorithm" #include"list" #include"functional" // void PrintV(vector <int > &temp) { for (vector<int>::iterator it = temp.begin