this和 闭包

构造函数中的this

 //如果函数作为构造函数使用,this就指向它new处来的对象

   function S(){
       this.name="alice";
       this.age=30;
       console.log(this.name);

   }
   var a=new S();

普通函数中的this

//如果函数作为普通函数调用,this就指向window对象
function foo(){
    this.name="alice";
    this.age=30;
    console.log(this.name);
}
foo();//alice
console.log(window.name);//alice
console.log(window.age);//30

函数作为对象的一个属性

函数作为对象的一个属性,如果函数作为对象的一个属性调用时,函数中的this指向该对象

var obj={
    x:10,
    fn:function(){
       console.log(this.x);

  }

 };
//obj.fn();//10
  var br={
      x:20
  };
br.fn=obj.fn;
br.fn();//20

函数用call或apply调用

 var test = "Tony";
function doSomething() {
    console.log(this.test);
}
var obj = {
    test:"Tom"
};
doSomething();//Tony;
doSomething.call(obj);//doSomething中的this指向obj

//示例
function person(){
    this.name="alice";
    this.age=20;
}
function Man(){
    person.call(this);//this指向的是调用的对象
}
var s=new Man();
console.log(s.name);//alice

全局&普通函数的调用

在全局环境下,this指向的是window对象

console.log(this === window);//true

普通函数调用时,其中的this也是指向的window对象

var x = 10;
var fn = function() {
console.log(this);//window
console.log(this.x);//10
};
fn();

虽然函数f是在obj对象内部定义的,但是他任然是一个普通函数,this指向的还是window对象.

var x = 20;
var obj = {
    x:10,
    fn:function() {
        function f() {
            console.log(this);//window
            console.log(this.x);//20
        }
        f();
    }
};
obj.fn();

构造函数prototype

this代表的是当前对象的值,不仅仅是在构造函数的prototype,即便是在整个原型链中.

  function Fn(name, age) {
    this.name = name;
    this.age = age;
}
Fn.prototype.sayName = function() {
    console.log(this.name);
};
var f1 = new Fn("zhangsan", 20);
console.log(f1.name);

冒充 继承

//冒充
function Parent(name , age) {
        this.name = name;
        this.age = age;
        this.sayName = function() {console.log(this.name);}
    }

    function Child(name, age) {

//        this.obj = Parent;//冒充
//        this.obj(name, age);// 继承
//        delete this.obj;// 删除继承

        Parent.call(this, name, age);
    }
    var c = new Child("zhangsan", 21);
    console.log(c.name);

闭包

1.函数作为返回值

//fn()作用域里存放的是变量a=20; bar()作用域 里面的a会依赖用fn()作用域
function fn(){

    var a=20;/ /局部变量在函数执行完成后未被销毁
    return function bar(m){
        if(m>a){
            console.log(m);
        }
    }
}
var test=fn();//test实际就是个function
test(30);

2.函数作为参数传递

var a=20;
var fn=function(m){
    if(m>a){
        console.log(m);
    }
};

//匿名函数 f是形参,fn是实参。中间部分是定义
(function(f){

    var a=100;
    f(30);
}) (fn);

 下面以个例子说明闭包
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <ul id="ul">
            <li>0</li>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
        <ul>
            <li>0</li>
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ul>
    </body>
    </html>
    <script>

         var lis=document.getElementById("ul").getElementsByTagName("li");
    
         for( var i=0;i<lis.length;i++){
 
                //匿名函数作用就是将每一次变量i的值存起来,让它不被销毁 形参a 实参i
             (function(a){
    
                 lis[i].onclick=function(){
                  console.log(a);
               
                 }
             }(i))
    
         }
    </script>
时间: 2024-12-28 15:06:12

this和 闭包的相关文章

Javascript学习日志(三):闭包

说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式,虽然核心思想都一致,但是实在是不能做到自己的理解,后来结合函数作用域链,好不容易有点开窍,趁着热乎劲儿,赶紧写下来,感兴趣的可以参考一下. 闭包:高级编程上面的解释是指有权访问另一个函数作用域中的变量的函数,(是一个函数): 创建闭包的常见方式,就是在一个函数内部创建另一个函数. 在理解闭包之前,

Python 闭包函数

一.定义: 1. 定义在函数内部的函数 2. 包含对外部作用域名字的引用,而不是对全局作用域名字的引用那么该内部函数就称为闭包函数 x=1 def f1(): x=11111111111 def f2(): print(x) return f2 func=f1() 二.闭包函数的应用:惰性计算 def index(url): # url='https://www.python.org' def get(): # return requests.get(url).text print(reques

学习Javascript闭包(Closure)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外

Python 闭包

闭包 1.注意:返回的函数内部不要使用后续会发生变化的变量. def f(): gs = [] for k in range(1, 4): def g(i): return i + k gs.append(g) return gs 例如这段代码感觉上应该返回三个函数分别return i+1.return i+2.return i+3(i为新函数参数),但事实却是得到了三个return i+3. >>> from test import f >>> g1, g2, g3

swift 深入理解Swift的闭包

我们可用swift的闭包来定义变量的值. 先来一个简单的例子大家先感受感受. 定义一个字符串的变量的方法: 直接赋值 var str="JobDeer" 还可以用闭包的方式定义: var str:String={ return "JobDeer" }() 闭包还可以这么定义,省略了等号和括号: var str:String{ return "JobDeer" } 闭包中可以定义get方法. var str:String{ get{ return

浅谈Js闭包现象

一.1.我们探究这个问题的时候如果按照正常的思维顺序,需要知道闭包是什么它是什么意思,但是这样做会让我们很困惑,了解这个问题我们需要知道它的来源,就是我们为什么要使用闭包,先不管它是什么意思!      2.我们使用闭包是因为js的作用域问题,前面我们已经对作用域了解了一些,在函数中,外部不能读取到内部的变量,而内部可以读取到外部的变量,这其实也是js特殊的一个地方!(这个特殊其实是因为函数的作用域是一条作用域链,而且作用域链是有顺序的,我们称之为链式作用域结构!)那么问题来了,如果我们想要从函

js的闭包概念

一.变量的作用域要懂得闭包,起首必须懂得Javascript特别的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript说话的特别之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999另一方面,在函数外部天然无法读取函数内的局部变量.Js代码 function f1(){ var n=999; } alert(n); // error这里有一个处所须要重视,函数内部声明变量

对js中闭包,作用域,原型的理解

前几天,和朋友聊天,聊到一些js的基础的时候,有一种‘好像知道,好像又不不知道怎么讲的感觉’...于是捡起书,自己理一理,欢迎拍砖. 闭包 理解闭包首先要理解,js垃圾回收机制,也就是当一个函数被执行完后,其作用域会被收回,如果形成了闭包,执行完后其作用域就不会被收回. 如果某个函数被他的父函数之外的一个变量引用,就会形成闭包 闭包的作用,就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部不能直接访问该变量. 例子(使用闭包): var test=(function(){ var

一个循环和闭包的例子

1 for (var i=1; i<=5; i++) { 2 setTimeout(function timer() { 3 console.log(i); 4 }, i*1000); 5 } 预期:分别输出数字 1-5,每秒一次,每次一个. 实际上,会每秒一次输出 5次6,. 知识点: JS引擎是单线程的,定时器的工作方式:按指定时间间隔,将定时器的代码添加到JS引擎的消息队列:而非到了指定的时间立即执行回调函数. 在上例中, 作用域 尽管循环中的五个函数在各个迭代中分别定义,但都被封闭在一个

(转)js闭包初入门

先看一段JS代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 function a(){             var num = 0;             function b(){                 num++;                 console.log(num);             }             return b;         }         var add = a();         add();