JS高级(三)--原型链、闭包、作用域、函数的四种调用方式

一、原型链(家族族谱)


  • 概念:JS里面的对象可能会有父对象,父对象还会有父对象,。。。。。祖先
  • 根本:继承

属性:对象中几乎都会有一个__proto__属性,指向他的父对象

意义:可以实现让该对象访问到父对象中相关属性

  • 根对象:Object.prototype

var arr=[1,3,5]

arr.__proto__:Array.prototype

arr.__proto__.__proto__就是找到了根对象

function Animal(){}
var cat=new Animal();
//cat.__proto__:Animal.prototype
//cat.__proto__.__proto__:根对象
  • 错误的理解:在js中,万物继承自Object? -->在js中万物继承自Object.prototype

二、作用域


(一)、变量作用域

  • 变量作用域的概念:就是一个变量可以使用的范围
  • JS中首先有一个最外层的作用域:称之为全局作用域
  • JS中还可以通过函数创建出一个独立的作用域,其中函数可以嵌套,所以作用域也可以嵌套
var age=18; //age是在全局作用域中声明的变量:全局变量
function f1(){
    console.log(name); //可以访问到name变量
    var name="周董" //name是f1函数内部声明的变量,所以name变量的作用域就是在f1函数内部
    console.log(name); //可以访问到name变量
    console.log(age); //age是全局作用域中声明的,所以age也可以访问
}
console.log(age); //也可以访问
//-->1级作用域
var gender="男";
function fn(){
    console.log(age);    //因为age是在fn作用域内声明的
    //age:undefined:既然有值就是可以访问
    console.log(height);//height不是在该作用域内部声明的,所以不能访问
    //-->2级作用域
    return function(){
        //-->3级作用域
        var height=180;
    }
    var age=5;
}

//注意:变量的声明和赋值是在两个不同时期的
function fn(){
    console.log(age);   //undeinfed
    var age=18;
    console.log(age);   //18
}

//fn函数执行的时候,首先找到函数内部所有的变量、函数声明,把他们放在作用域中,给变量一个初始值:undefined    -->变量可以访问
//逐条执行代码,在执行代码的过程中,如果有赋值语句,对变量进行赋值

function fn(){
    var age;        //初始值:undefined
    console.log(age);   //undeinfed
    age=18;     //修改了变量的值
    console.log(age);   //18
}

(二)、作用域链

  • 由于作用域是相对于变量而言的,而如果存在多级作用域,这个变量又来自于哪里?这个问题就需要好好地探究一下了,我们把这个变量的查找过程称之为变量的作用域链
  • 作用域链的意义:查找变量(确定变量来自于哪里,变量是否可以访问)
  • 简单来说,作用域链可以用以下几句话来概括:(或者说:确定一个变量来自于哪个作用域)
  1. 查看当前作用域,如果当前作用域声明了这个变量,就确定结果
  2. 查找当前作用域的上级作用域,也就是当前函数的上级函数,看看上级函数中有没有声明
  3. 再查找上级函数的上级函数,直到全局作用域为止
  4. 如果全局作用域中也没有,我们就认为这个变量未声明(xxx is not defined)
function fn(callback){
    var age=18;
    callback()
}

fn(function(){
    console.log(age);
    //分析:age变量:
    //1、查找当前作用域:并没有
    //2、查找上一级作用域:全局作用域
    //-->难点:看上一级作用域,不是看函数在哪里调用,而是看函数在哪里编写
    //-->因为这种特别,我们通常会把作用域说成是:词法作用域
})

举例1:

    var name="张三";
    function f1(){
        var name="abc";
        console.log(name);  //abc
    }
    f1();

举例2:

    var name="张三";
    function f1(){
        console.log(name);  //underfind
        var name="abc";
    }
    f1();

举例3:

    var name="张三";
    function f1(){
        return function(){
            console.log(name); //underfind
        }
        var name="abc";
    }
    var fn=f1();
    fn();

举例4:

    var name="张三";
    function f1(){
        return {
            say:function(){
                console.log(name);  //underfind
                var name="abc";
            }
        }
    }
    var fn=f1();
    fn.say()

原文地址:https://www.cnblogs.com/junjingyi/p/9191792.html

时间: 2024-10-11 12:21:39

JS高级(三)--原型链、闭包、作用域、函数的四种调用方式的相关文章

Javascript中函数的四种调用方式

一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属性:arguments和this. arguments主要是用来保存函数参数,arguments中的callee属性主要是用来指向拥有当前arguments的函数(理解Javascript参数中的arguments对象). 3.在ECMAScript5中规范了另一个函数属性:caller(Opera

js函数的四种调用方式以及对应的this指向

一.函数调用,此时this是全局的也就是window 1 var c=function(){ 2 alert(this==window) 3 } 4 c()//true 二.方法调用 var myObj={ value:2, inc:function(num){ alert(this.value+num); } } myobject.inc(1); //结果3,因为this指向myObj 注意:内部匿名函数不属于当前对象的函数,因此this指向了全局对象window var myObj={ na

函数的四种调用方式

1.函数模式 function show(){ } show() var show=function(){ } show() 2.方法模式 var obj={ } function show(){ } obj.showFn=show; obj.showFn(); 3.构造函数模式 function personFn(name){ this.name=name; this.showName=function(){ console.log('名字为'+this.name) } } var perso

函数的四种调用模式.上下文调用.call.apply

闭包:函数就是一个闭包,一个封闭的作用域; 返回函数,要返回多个函数就用一个对象封装一下, 立即执行函数+return 回调函数 JS动态创建的DOM,不会被搜索引擎抓取,对SEO不友好. /*window的name属性*/ function fn(){ console.log(this.name); } fn.call({name:"zhangsan"});//"zhangsan" console.log(); fn();//'' 打印空字符串,此时调用fn其中的

函数的四种调用模式

函数的四种调用模式 1.函数模式 特征 就是一个简单的函数调用,函数名前面没有任何的引导内容 this含义 this在函数模式中表示全局对象,在浏览器中是windjow对象 2.方法模式 特征 方法一定是依附与一个对象,将函数赋值给对象的一个属性,那么就成为了方法 this含义 this在方法模式调用中表示所依附的这个对象 3.构造器调用模式 与方法模式的this的区别 由于构造函数知识给this添加成员,没有做其他事情,而方法也可以完成这个操作,就this而言,构造函数与方法没有本质区别 特征

函数的四种调用模型

函数的四种调用模式在 js 中 无论是函数, 还是方法, 还是事件, 还是构造器, ... 其本质都是函数. 只是处在不同的位子而已. 四种: 函数模式方法模式构造器模式上下文模式1. 函数模式 特征: 就是一个简单的函数调用. 函数名的前面没有任何引导内容. function foo () {} var func = function () {}; ... foo(); func(); (function (){})();this 的含义: 在 函数中 this 表示全局对象, 在浏览器中是

JavaScript中函数的四种调用模式

理解函数的四种调用方法,可以有效的帮助我们分析和理解JavaScript代码.但是经常有人分不清楚或者不理解这四种调用模式,在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用.函数有四种调用模式,分别是:1.函数调用形式 2.方法调用形式 3.构造器调用形式 4.上下文调用形式(apply,call)这里所有的调用模式中,最主要的区别在于关键字 this 的意义.下面分别介绍这几种调用形式. 一.函数调用形式

javascript中函数的四种调用模式详解

介绍函数四种调用模式前,我们先来了解一下函数和方法的概念,其实函数和方法本质是一样,就是称呼不一样而已.函数:如果一个函数与任何对象关系,就称该函数为函数.方法:如果一个函数作为一个对象属性存在,我们就称之为方法.接下来就可以开始今天的主体. 1.函数调用模式. 就是通过函数来调用,规范写法为:function fn(){} fn(); 函数中this的指向->window.案例如下: var age = 38; var obj = { age: 18, getAge: function() {

JS高级——Function原型链

基本概念 1.函数可以通过Function new出来,那么Function可以被称作构造函数,被new出来的函数可以被称为一个对象 2.Function既然是构造函数,那么肯定也有原型,它的原型是一个空的函数 3.Function的原型对象的原型对象最终指向的是object.prototype 原型链图 由上面基本概念衍生出的原型链图 1.Person构造函数,它既然是函数,那么肯定可以通过Function创建出来,那么就可以被当作对象 2.P对象还是函数对象,最后指向的都是object.pr