随笔js
js中的函数定义之后,函数名就是这个函数(JS中函数其实也是对象)的地址(句柄)
js读取函数内存地址:
首先想读内存地址只有C或者C++,汇编抛开不谈,其他高级语言一般都封装起来了,不过我也不能确定所有的,接触有限。下面仅供参考,只是一些理论,没有实践过。js去向后台请求读内存,后台代码利用api访问得到相关内存的指针,取出地址来返回给前端。。
变量对象(vo)
在一些js 引擎的实现中 vo是用__parent__ 属性来表示的。我们甚至能够 访问到它 并且改变它。
变量对象(vo):变量对象是上下文里面的一个隐藏对象。保存着我们定义的数据,变量对象包括3个内容:
1.声明的变量
2.声明的方法
3.函数的形参
只有在全局上下文中 我们才可以通过vo直接访问变量。因为这时候vo就是 global 本身。而在其他上下文我们是访问不到vo的。vo只是内部实现。我们定义的变量、方法都是vo的属性。
在全局上下文中 ,vo===this===global
在函数上下文中,我们在进入函数上下文的时候创建vo,这时候称呼他为ao(activation object)。在刚进入这个上下文的时候 ao 就有了属性。就是 arguments。然后 会扫描 变量声明 和函数声明。扫描优先级为(主要指同名的时候 覆盖问题):函数>参数>变量。
function test(x){ alert(x); function x(){ } } test(1);
function test(x,y,z){ console.log(arguments) } test(1,2);
arguments 主要有下面几个属性组成。
callee 调用的函数本身
length 参数长度。(这里需要注意 这个长度 是参数的真实长度 看上面的例子 为2.)
properties-indexes 就是参数 数组。 里面的个数 是和上面的length 一致的。 并且和传递进来的参数指向同一地址。这里需要注意的是 比如上面的例子 arguments[0]和x是共享的。arguments[1]和y是共享的。但是 arguments [2]和 y却不是共享的。
————————————————
this
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,
这个隐含的参数就是this,this指向的是一个对象,
这个对象我们称为函数执行的上下文对象,
根据函数的调用方式的不同,this会指向不同的对象
1.以函数的形式调用时,this永远都是window
2.以方法的形式调用时,this就是调用方法的那个对象
隐式调用
1. 以函数的形式调用时,this永远都是window var b="global" function baz(){ var b="baz" console.log(this.b) bb() } var bb=function(){ console.log(this.b) } baz() console.log(window.b)
显示调用
"use strict" // 2.以方法的形式调用时,this就是调用方法的那个对象 var name="global" var func=function(){ console.log(this.name) } var obj1={ name:"hello", fun:func } var obj2={ name:"world", fun:func } obj1.fun() //hello obj2.fun() //world console.log(window.name) //global
<script> var x = 'global' function testThis () { // this.x = 'fuck'; // console.log(this) console.log(this.x) } function innerObj () { this.x = 'inner'; testThis(); this.innerTestThis = testThis; this.innerTestThis(); } function wrapObj () { this.x = 'wrap'; // var test = new testThis(); // console.log(test.x) testThis(); this.wrapTestThis = testThis; this.wrapTestThis(); this.innerTestThis = new innerObj(); } var wrap = new wrapObj(); wrapObj(); </script>