【前端学习】javascript作用域(链)和this

来源:互联网 发布:抓取淘宝订单数据 编辑:程序博客网 时间:2024/05/04 18:14

前言

    要想学好javascript,理解作用域和this是非常重要的,尤其是this,对刚学习这门语言的新手来说,理解起来绝对是个挑战,但是如果不好好掌握的话,你就没法理解一些代码的意图,因为javascript中的this很诡异。 为了学习这些知识,我除了看书意外,从网上找了一些比较通俗易懂的文章,分享给大家,详细后后面的参考文章。

关于作用域链

    为了了解javascript中变量的检索机制,首先需要掌握作用域和作用域链的知识。关于这些知识,大家还是参考文章后的参考文章,写得非常详细。这里我分享下个人学习的总结和理解:
javascript中作用域是什么?
    作用域是为了控制变量和函数的可访问范围、可见性以及生命周期。 就是在语言解释执行的过程中,针对不同的语法(function、with语句等)开辟一个存储区域,该区域就是一个作用域,该区域里的数据能否被其它内存区域访问,需要按照一定的规则来(javascript语法规则)。

javascript中哪些语法会开辟一个新作用域?
1. 函数(function)
2. with语句
3. try …. catch语句

javascript中作用域链是什么?
    理解代码运行原理的朋友可能知道,代码的执行,首先会在一个被称作“运行环境”的区域的里执行(这环境其实就是个栈),一旦碰见开辟新作用域的语法时,就会在当前环境下又开辟一个“运行环境”(新开辟一个作用域)。当然,当前的“运行环境”是不能访问新创建“运行环境”里的数据,但是新”运行环境“却可以访问当前“运行环境”, 这就相当于 新”运行环境”作用域可以链到当前“运行环境”作用域,从而形成一个类似“链表”的东西。

关于this

    关于this,建议大家一定要好好掌握,多从网络上找相关资料,学习理解,形成自己的知识体系。下面分享一下本人学习总结和理解:
1. 和java编程语言一样, 每个”运行环境”中都有一个this,this可理解成一个对象。
2. 和java不一样的是,java中this是“固定”的,this指的就是当前方法所在的宿主对象,不可改变。而javascript中的this有点不一样,javascript中某个“运行环境”的this可以是任何对象,我们完全可以通过call、applay方法来改变它。当然也可以通过bind方法来生成一个已经指定了this的函数, 指定了this的函数不能通过call或apply来重新设置它的this值。
具体可参照下面代码加深理解:

obj1 = {name:"obj1"} obj2 = {name:"obj2"}name = "global";function fn() { console.log(this.name);}fn(); // global 全局this 根据ES实现各不相同 浏览器下是window node下是空对象fn.apply(obj1); //obj1fn.apply(obj2); // obj2var fbn = fn.bind(obj2); //生成一个指定了this的函数fbn(); //obj2 this是obj2fbn.apply(obj1); //obj2 apply不能改变已经绑定了this的this值

参考文章

理解javascript作用域和作用域链
详解this
javascript中this对象详解

0 0
原创粉丝点击