如何区分对象还是函数

我超我才发现我的VSCode皮肤文字颜色蓝色是对象,绿色是函数!!!!!!一看就懂~

argumens是什么

arguments是包含了所有参数的伪数组,可以用Array.from()变为数组
如果不加’use strict’,this会尽量把你传的东西变成对象

this是什么

详见这篇文章
https://zhuanlan.zhihu.com/p/23804247

如何传 arguments

调用 fn 即可传 arguments
fn(1,2,3) 那么 arguments 就是 [1,2,3] 伪数组

如何传 this

目前可以用 fn.call(xxx, 1,2,3) 传 this 和 arguments,而且 xxx 会被自动转化成对象(JS 的糟粕)

为什么要用this

我们先写函数,后面再引用,需要用一个东西代表后面传进来的参数
我们想让函数获取对象的引用,但是并不想通过变量名做到
Python 通过额外的 self 参数做到,JS 通过额外的 this 做到
JS 在每个函数里加了 this,用 this 获取那个未知对象

  1. let person = {
  2. name: 'frank',
  3. sayHi(this){
  4. console.log(`你好,我叫` + this.name)
  5. }
  6. }
  7. person.sayHi()

person.sayHi() 相当于 person.sayHi(person),然后 person 被传给 this 了(person 是个地址)这样,每个函数都能用 this 获取一个未知对象的引用了。
也就是说,person.sayHi()会隐式地把 person 作为 this 传给 sayHi

this的两种使用方法

隐式传递

fn(1,2) // 等价于 fn.call(undefined, 1, 2)
obj.child.fn(1) // 等价于 obj.child.fn.call(obj.child, 1)

显示传递

fn.call(undefined, 1,2)
fn.apply(undefined, [1,2])

神志不清胡言乱语

如果函数用一个对象来调用,那么这个函数里面的this就是前面那个对象

如:obj.fn(p1) === obj.fn.call(obj,p1)
变态的来了:jQuery(‘.test’)等于什么?
答案是:window.jQuery(window,’.test’)
其中window是对象,jQuery是函数,’.test’是选择器

对象里面可以有函数(也叫方法),这些函数会去操作你的元素。