zoukankan      html  css  js  c++  java
  • js学习笔记之this指向及形参实参

        var length = 10
        function fn () {
            console.log(this.length)
        }
        var obj = {
            length: 5,
            method (fn) {
                fn()
                arguments[0]()
            }
        }
        obj.method(fn, 1)
    

    这一段代码会输出什么?

    在非严格模式下,会分别输出10和2

    在严格模式下和node、vue环境中会直接报错:length属性undefined

    要理解为什么会出现这种情况,就需要理解this的作用域

    普通函数的this是由动态作用域决定的,它总是指向它的直接调用者,具体可以分为:

      1.this总是指向他的直接调用者,如arguments[0](),arguments[0]为arguments对象的第一个值,所以this指向arguments,输出的是arguments.length

      2.如果函数没有直接调用者,如fn(1),在非严格模式下,this总是指向window,即使在method函数中重新定义fn函数,所以会输出window.length;

         在严格模式下,this为undefined,undefined.length自然会报错

      3.使用call,apply,bind绑定的,this指向的是绑定的对象

    箭头函数的this是由静态作用域决定的,即始终指向定义函数时的作用域

    arguments.length为什么为2

    arguments对象包含传递给函数的每个参数,即函数的实参

    obj.method(fn, 1)调用时传递了2个参数,所以arguments.length = 2

    要注意的是this指向的是他的直接调用者,而非函数本身,函数fn的length会指明函数的形参个数

    函数fn定义时没有参数,也就是没有形参,所以fn.length = 0

    这里还有个隐藏的知识点

    在严格模式下,剩余参数、默认参数和解构赋值参数的存在不会改变 arguments对象的行为,但是在非严格模式下就有所不同了。

    具体可以参看 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments

  • 相关阅读:
    清除浮动
    echarts设置小图标位置
    dedecms 顶级栏目内容显示
    dedecms 后台网站 标题设置
    mouseover,mouseenter,mouseout,mouseleave的区别
    texterea 水平居中
    echarts x轴文字换行显示
    echarts 拐点添加图片
    css首行缩进2个字符
    bootstrap 内边框样式
  • 原文地址:https://www.cnblogs.com/nightstarsky/p/10560055.html
Copyright © 2011-2022 走看看