随笔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> 

  

 

 

posted @ 2020-01-27 18:02  知一以天  阅读(165)  评论(0编辑  收藏  举报