js self = this的解释

Demo 1:

  function Person(){
        this.name = ‘hjzgg‘;
        this.age = 24;

        this.show = function(){
            alert(name + " " + age);
        }
    }

    var p = new Person();
    p.show();

  错误:name 和 age都没有定义。

Demo 2:

  function Person(){
        this.name = ‘hjzgg‘;
        this.age = 24;

        this.show = function(){
            alert(this.name + " " + this.age);
        }
    }

    var p = new Person();
    p.show();

  正确。

Demo 3:

  function Person(){
        this.name = ‘hjzgg‘;
        this.age = 24;

        this.show = function(){
            alert(this.name + " " + this.age);
        }
    }

    var p = new Person();
    p.show.call({});

  错误:name 和 age 未定义。

Demo 4:

  function Person(){
        this.name = ‘hjzgg‘;
        this.age = 24;

        var self = this;

        this.show = function(){
            alert(self.name + " " + self.age);
        }
    }

    var p = new Person();
    p.show.call({});

  通过 var self = this,正确。

Demo 5:

  function Person(){
        this.sayHello = function(){
            alert(‘hello world!‘);
        }

        this.show = function(){
            sayHello();
        }
    }

    var p = new Person();
    p.show();

  错误:sayHello未定义。

Demo 6:

  function Person(){
        var sayHello = function(){
            alert(‘hello world!‘);
        }

        this.show = function(){
            sayHello();
        }
    }

    var p = new Person();
    p.show();

  正确。

  

结论:

  每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的,即在全局对象中,this指向的是window对象;在自定义函数中,this对象指向的是调用这个函数的对象,也就是说,this指向的是调用执行环境的那个对象。如果是在函数嵌套环境中,this指代的是调用外部函数或者内部函数的执行环境的对象。
  那么这里可能又会出现新的疑问:为什么self.name 和 self.age是正确的呢?
  其实这又涉及到另一个话题:实例成员与局部成员。我们创建构造函数的意义就是要用它来创建实例,那么所有属于实例的成员都需要用this来定义;而只有那些不属于实例的成员才不会用this定义;当然,用this定义了方法以后,在函数作用域内部要调用此方法时,就需要加上this了。

Demo 7:

 var person = {
        name : ‘hjzgg‘,
        age : 24,
        show : function(){
            alert(name + " " + age);
        }

   }

   person.show();

  错误:name 和 age未定义。

Demo 8:

 var person = {
        name : ‘hjzgg‘,
        age : 24,
        show : function(){
            alert(this.name + " " + this.age);
        }

   }

   person.show();

  正确。

Demo 9:

 var person = {
        name : ‘hjzgg‘,
        age : 24,
        show : function(){
            alert(this.name + " " + this.age);
        }

   }

   person.show.call({});

  错误:name 和 age 未定义。

Demo 10:

var person = {
        name : ‘hjzgg‘,
        age : 24,
        show : function(){
            alert(person.name + " " + person.age);
        }

   }

   person.show.call({});

  正确。

时间: 2025-01-02 09:26:39

js self = this的解释的相关文章

Js apply 方法 具体解释

Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了,在这里我做例如以下笔记,希望和大家分享..  如有什么不正确的或者说法不明白的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解决一下几个问题: 1.        apply和call的差别在哪里 2.        什么情况下用apply,什么情况下用call 3.        ap

JS中的预解释

1.什么是预解释? 在当前作用域下,JS代码执行之前,首先会把带var/function关键字的进行提前的声明(declare)或者定义(defined). 2.预解释是如何操作的? a.带var关键字的在预解释阶段只完成了提前的声明:b.带function关键字的在预解释阶段完成了声明和定义两个操作. 3.预解释的注意点? a.不管条件判断是否成立,判断体中的内容都要进行预解释: 例如:if (!('a' in window)) { var a=12;  //判断'a'是否为window的一个

js中Prototype属性解释及常用方法

1.prototype的定义 javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属性叫做原型.这个属性非常有用:为一个特定类声明通用的变量或者函数. 你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在.你可以看看下面的例子: function Test(){} alert(Test.prototype); // 输出 "Object" 1.

JS学习之预解释

预解释:在js中,代码从上到下执行之前,(浏览器默认)首先会把所有带var和function关键字的进行提前的声明或者定义声明(declare):相当于种树时候"挖坑" var num;(var一个变量) 只声明没有定义的时候,num的默认值是undefined定义(defined):相当于种树时候"栽树" num=12;(给变量赋值) 在预解释的时候,带var和带function的还不一样:var:只是提前的声明(定义赋值的部分是在代码执行的时候完成的)funct

js的Prototype属性 解释及常用方法

JavaScript能够实现的面向对象的特征有: ·公有属性(public field) ·公有方法(public Method) ·私有属性(private field) ·私有方法(private field) ·方法重载(method overload) ·构造函数(constructor) ·事件(event) ·单一继承(single inherit) ·子类重写父类的属性或方法(override) ·静态属性或方法(static member) 例子一(JavaScript中允许添加

[js]js栈内存的全局/私有作用域,代码预解释

js代码如何执行的 浏览器提供执行环境: 全局作用域(提供js执行环境, 栈内存) --> 执行js需要预解释 - 带var : 提前声明 - 带function关键字的: 提前声明+定义 js中的栈内存(对应全局/私有作用域)和堆内存 <script> // 基本: num str boollen null undefied // 引用: [] {} \^$\ Date var num = 12; var obj = {name: "maotai", age: 22

js日常分享

1,网页后退<a href="??????">后退</a>so easy 的问题在百度就是没找到,我学asp.net的,或者用linkbutton实现也可以,就是做后退功能asp.net 标签 a分享到: ------解决方案--------------------<a href="javascritp:history.go(-1)">后退</a>------解决方案--------------------... 用J

JS里引用CSS属性时候的命名

????如果JS代码中设置<p>元素的另一个CSS属性font-family.这个属性的获取方式与color属性略有不同,因为 font和family之间的连字符与JS中减法操作符相同,JS会把它解释为减号.如果你像下边这样访问名为 font-family 的属性,会收到一条出错信息: ????Element.style.font-family ????JS将减号前边的内容解释为"元素的style属性的font属性",把减号后的内容解释为一个名为family的变量,将整个表

jquery.dragsort.js 实现拖拽过程遇到的问题

1.在IE下第一次拖动的时候,被拖动的li元素会不显示,查了很多资料发现是因为在IE中定位出了问题,li标签还在,只是位置计算出错.解决的办法是在li的css样式中position设置为relative.这个问题在火狐等其他浏览器是不存在的. 2.如果拖动的li所在容器出现了滚动条,当滚动条滑到最下面的时候,拖拽下面的li的浮动层位置会出现偏移.解决的办法是在jquery.dragsort.js中,this.draggedItem.css({ top: top, left: left });这句