Javascript中的var self = this

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <script type="text/javascript">
            //            javascript中每个函数解析时, 都会创建两个特殊的变量:
            //            这和参数, 这两个变量都能在函数体内访问, 所以每个函数都有属于自己的这个对象和参数
            //
            //            当然这个该对象是在执行时基于函数的执行环境绑定的,
            //
            //            即在全局对象中, 这指向的是窗口对象;
            //            在自定义函数中, 这个对象指向的是调用这个函数的对象;
            //            下面这个函数执行的时候, 第一个这样指向的就是窗口对象,
            //            因为它在窗口环境下执行的, 第二个这种对象指向的是objThis对象,
            //            因为它在objThis对象下执行的
            var wsscat = function(name) {
                var self = this;
                this.name = name;
                console.log(this);
                console.log(self);
            }
            wsscat(‘wsscat‘);
            window.wsscat(‘wsscat‘); //因为它在window对象下执行的
            var objThis = {
                x: ‘autumns‘,
                wsscat: wsscat
            }
            objThis.wsscat(); //因为它在objThis对象下执行的
            //            当我们把这个构造函数变成对象的时候,这个本就是指向自己的wsscat对象
            var wsscat = function(name) {
                var self = this;
                this.name = name;
                console.log(this);
                console.log(self);
            }
            ////通过构造函数new一个新对象时,this就指这个新对象
            var obj = new wsscat(‘wsscat‘); //log wsscat{name:‘wsscat‘}对象
            //            这个给出一个私有的自我参数,这个可以令对象这个对私有方法func3可见,
            //            所以当我们在构造函数中出现闭包(私有函数/嵌套函数下面例子中的函数func3())都要注意,
            //            此时里面的这个是属于窗口对象的
            var wsscat = function(name) {
                var self = this;
                var x = ‘autumns‘;
                this.name = name;
                console.log(this);
                console.log(self);
                this.func = function() {
                    console.log("wsscat‘s func");
                };
                this.func2 = function() {
                    func3(); //不能用self.func3()和this.func3()
                }
                //闭包里面,既嵌套函数里面如果想使用wsscat对象的方法或者变量要用self
                function func3() {
                    console.log(this) //指向window对象
                    //this.func();//报错this.func is not a function
                    self.func(); //不能用this.func(),也不能用func()
                    console.log("wsscat‘s func3");
                }
            }
            var obj = new wsscat(‘wsscat‘);
            obj.func2()
        </script>
    </body>

</html>

原文地址:https://www.cnblogs.com/LLX8/p/9212298.html

时间: 2024-07-29 16:32:02

Javascript中的var self = this的相关文章

关于Javascript中通过var关键字声明变量和function关键字声明函数的笔记

一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1,b,c; //关键字显式声明变量a,b,c,并给a赋值console.log(a); //1 //由于b,c未定义变量类型,因此输出"undefined"console.log(b); //undefinedconsole.log(c); //undefined //如果变量未声明,则输出

Javascript中的var和let

引子 我们先来看一个常见的例子, function func(){ for (var i = 0; i < 10; i++) { setTimeout(function(){ console.log(i) },1000) } } func() 输出的结果并不是我们预期的 0-9,而是输出了十个 10.而当我们把其中的 var 改成 let ,结果就成了 0-9. 原因 var 使用的是函数作用域,即 for 循环中的 var i 实际上在整个 func 函数中都有效.而 setTimeout 中

javascript中的var关键字中的文章

javascript在声明变量时忽略var关键字是完全合法的.JavaScript作为弱类型(loosely-typed)的语言,不声明变量类型貌似是可以理解的,但是事实不是这么的直白,因为变量的属性除了类型外,还有作用域.下面举例说明: no.1 <script language="javascript"> var a = 0; document.write(a + '<br>'); var b = 1; function foo() { document.w

javascript中使用var定义变量的预编译效果

首先说明一点:javascript语法是非常灵活的,灵活的代价就是很容易导致不规范的编码和各种意想不到的运行结果.ECMAScript 5 引入了 严格模式 (strict mode),今后我们编写javascript代码最好都使用"use strict",规范我们的javascript代码.下面的测试代码不是基于严格模式. alert(a); var a;//已声明未赋值 alert(b);//未声明的变量 执行结果是:a打印undefined,b报错.这说明:var a;这条语句的

JavaScript 中 for (var i in data) 循环数组项

今天在改代码的时候发现有很多代码的循环是用 for(var i in data)写的,我通常都是用for(var i=0;i<data.length;i++) 就查看了一下,原来这两个是有区别的,不能等同使用. <script>Array.prototype.test = function () { }; function a (){ var arr = [1, 2]; for (var i in arr) { alert(i+"-------------"+arr[

JavaScript中var关键字的使用详解

作用 声明作用:如声明个变量. 语法 ? 1 var c = 1; 省略var 在javascript中,若省略var关键字而直接赋值,那么这个变量为全局变量,哪怕是在function里定义的. ? 1 2 3 4 5 6 7 8 <script type="text/javascript">   function Define() {     a = 2;   }   function Hello() {     alert(a);   } </script>

javascript中var、let和const的区别

在javascript中,var.let和const都可以用来声明变量,那么三者有什么区别呢?要回答这个问题,我们可以从先想想:三种不同的声明会影响变量的哪些方面?这些方面也就是变量的特性,那么变量有哪些特呢?无非就是两个:一个是变量的数据类型,是数字,字符串还是数组或者其他的,另一个就是变量的作用域,是全局的还是局部的,又或者是某个代码块的.因此我们可以从以下两个方面来探究三种声明方式的区别: 1.声明后变量的数据类型有什么不同? 2.声明后变量的作用域有什么不同? 先看第一个方面,数据类型有

简单谈一谈JavaScript中的变量提升的问题

1,随笔由来 第一天开通博客,用于监督自己学习以及分享一点点浅见,不出意外的话,应该是一周一更或者一周两更.  此博客所写内容主要为前端工作中遇上的一些问题以及常见问题,在此基础上略微发表自己的一点浅见,如有出现错误,请看到的各位能够不吝赐教,此致谢意. 前几天在某技术群中水的正欢,忽然有群友提出了一个问题,虽然不难,卻是常人忽视的点,且出现次数较多,所以在此写一点东西,提醒一下自己. 2,JavaScript中的var 与 function 首先我们来看下面这个demo var f = fun

JavaScript中的let关键字

JavaScript中的let关键字 JavaScript中使用var定义变量可能存在的问题 var定义的变量没有块作用域 var定义的全局变量会自动添加全局window对象的属性 var定义的变量会提前装载 而let关键字的出现解决了以上的问题: <script type="text/javascript">                                for( let i = 0;i<10;i++){