js函数的作用域与this指向
来源:互联网 发布:模锻力计算模拟软件 编辑:程序博客网 时间:2024/05/29 02:24
原文地址:http://www.cnblogs.com/longze/p/3542582.html
函数的作用域与this指向是js中很重要的一部分,理清这点东西需要个逻辑,看看我的逻辑怎么样...
下面是个提纲,可以直接挑你感兴趣的条目阅读。
- 函数的定义方式:直接定义(window下,内部定义),对象的方法,对象原型的方法;
- 函数的调用方式:直接调用,call/apply,with
- 对于直接定义的函数和对象的方法,作用域默认状态下是它的定义处的作用域链。
- 对于直接定义的函数,this指向window。
- 对于对象的方法,this指向实例化对象(对应于实例化对象默认返回this的情况)。
- 用call/apply改变方法的this指向
- 在函数或方法的定义时可以通过with改变其作用域链。
下面分开来具体说说:
函数的定义,如提纲中提到的可以分为两种:直接定义(window下,内部定义),对象的方法(或对象原型的方法)。从下面的示例代码中可以看到函数fn1与fn2以及对象的方法doFunction在函数使用name时name的值来自相应的域。
在使用name的值时将“name”用“this.name”来代替会出现什么情况呢,看下例:
从结果来看可以验证提纲中的第4和5条,也可以看到this和作用域是两套分离的链,遵循个自的变量查询逻辑,具体的查询逻辑在下面的性能分析中会提到,如果是新手建议先看一下“js的作用域链”方面的基础知识。
关于函数的调用方法,我用下面的方示例说明提纲中的第2、6条:
调用时call和apply的使用是为了改变被调用函数的this指向。with的使用是为了改变被调用函数中变量的查询域。我们把上例中的call和name前的this去掉再加上with来演示with的作用。
看到with的使用并不方便,需要在被调用函数中添加with,有人可能想能不能向下面那样调用来整体改变变量作用域而不去改变被调用函数呢?
with (myScope) { fn1(); fn2(); var obj = new MyObj(); obj.doFunction();}
很遗憾,不可以!所以在一些成熟的框架中随处可见call和apply的使用,却很少用到with,在用JSHint检测js语法的时候with处都标了小红点,在一些js编码指导中也建议尽量少用with,因为with改变了变量的默认查询链,所以会给后期的维护人员一些困惑,还有性能方面的一些考虑,请慎用with。
- js函数的作用域与this指向
- js函数的作用域与this指向
- js函数的作用域与this指向
- js函数的作用域与this指向
- js函数作用域及this指向
- JS 改变函数中 this 的指向
- [JS]事件函数中this的指向
- JS-箭头函数中的this的指向
- JS this的指向
- js的this指向
- JS的this总结(下)-ES6箭头函数this指向
- JS中setTimeout的作用域以及this的指向问题
- 关于JS中for循环时,作用域问题和this指针指向的总结
- 实践与提高:js匿名函数与this变量在不同作用域的追踪
- JS:this关键字的指向
- js中this的指向
- js中this的指向
- js中this的指向
- Andriod中绘(画)图----Canvas的使用详解
- js 中读取JSON的方法探讨
- 遗传算法入门到掌握(二)
- 从2891个专栏里找出来的宝贝,望珍惜
- 关于字符串指针
- js函数的作用域与this指向
- 多重背包的两种求解形式
- Android Service完全解析,关于服务你所需知道的一切(上)
- 严重: Servlet.service() for servlet [default] in context with path [/aaa] threw exception
- 【UVA】 11624 Fire!【BFS】
- 别不信!App三年内将被HTML5顶替彻底消失?
- notify()和notifyAll()主要区别
- 子系统拆分的一点总结
- IIS7的FTP出错: 451 No mapping for the unicode character exists in the target multi-byte code page