zoukankan      html  css  js  c++  java
  • 随笔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> 
    

      

  • 相关阅读:
    MS SQL Server中的CONVERT日期格式化大全
    简历
    Spring源码IOC部分容器简介【1】
    HadoopHDFS设计原理
    1.Linux系统简介
    3.大话C语言变量和数据类型
    2.C语言初探
    7.函数
    8.C语言预处理命令
    9.指针
  • 原文地址:https://www.cnblogs.com/chargeworld/p/12236489.html
Copyright © 2011-2022 走看看