浅谈JavaScript(2)

变量提升

在非严格模式下,js可以先使用后声明,但是实际编程中一定要避免。

小知识:在函数中没有用var声明的变量均视为全局变量

    function a(){
        test = 1;
        var test2 = 2;
    }
    a()
    console.log(test)//输出1
    console.log(test2)//报错

事件

这一块应该是js+html的东西,在标签触发的事件,一般有两个阶段:

  1. 事件捕获(触发事件后,系统从父标签往下依次查找对应的标签),参数为true

  2. 事件冒泡(找到标签后,事件会从子标签往上传递,并依次触发),参数为flase

阻止冒泡/捕获的函数:event.stopPropagation(); vue中是.stop,vue事件监听都是冒泡,要监听捕获参数为.capture

至于事件委托,则是一种利用方法,我们可以在很多子标签的事件交由给父组件来监听,利用event.target.id来进行不同的操作。

事件循环:这个需要单独学习,一句话说不清楚

JavaScript垃圾回收机制

js垃圾回收主要通过:

  1. 标记清除:简单的讲,就是变量退环境了,就会被清理
  2. 引用计数:没有指向这个内存的任何变量时,该地区就会被清除,会引起内存泄露(比如两个对象间循环引用,还有闭包等等,需要小心谨慎)

Call Apply Bind

这三个玩意主要用来重定向this的,然后,bind返回值是一个函数,其他两个则是函数调用,其中apply调用函数,所有参数要放在一个数组里,其他的则是分开的。

原形链

首先明确一点,js是面向对象的语言,函数本质也是依附于对象的。js中所有对象和函数的源头都可以一直链接到Object()原生对象

所有函数都会有一个原型:名为prototype的对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkzZQXN3-1582904437186)(4.jpg)]

prototype有一个constructor属性会指向这个函数本身,意思就是构造器的意思,也就是原型和constructor是相对应的概念,A是B的原型,那么B就是A的构造函数,当然,由A函数创造出来的对象,其constructor属性自然指向A函数

console.log(a.prototype === a.prototype.constructor.prototype)//结果为true

这个prototype还有一个__proto__属性,指向产生这个原型的原型

所有对象创建时,都会有一个__proto__属性,该属性会指向产生他的函数原型,从而形成了一条链,注意,对象本身的prototype是undefined。

也就是说,实例原型和实例对象都有__proto__,两者都指向实例原型,但是前者指向"上级",而后者指向对应的实例原型。

对象的继承

继承又和原型链扯上关系了,我们可以通过原型链继承属性,继承的方法主要有两种,一种是在构造函数那里继承,另一种是在原型链上继承。

内容有点复杂,具体另外讨论。

柯里化

柯里化就是把一个函数的参数拆开,利用回调来实现多参数的传递,下面是例子:

function test(x){
    return function a(y){
        return (x+y)
    }
}
console.log(test(4)(5))
//换种写法:
function curry (fn, ...args) {
	return (..._args) => {
		return fn(...args, ..._args)
	}
}
function add(...args){
	return args.reduce((a, b)=>{
		return a + b;
    })
}
console.log(add(1,2,3,4,5,6))
console.log(curry(add,1,2,3,4)(5,6))

有些柯里化比较难,比如实现add(5)(6)(7)(11,2) == add(5,6)(7,11,2)

像这种有点难

一些dom操作

查找方法:
getElementsByTagName() //通过标签名称

getElementsByName() //通过元素的Name属性的值

getElementById() //通过元素Id

修改方法:

添加:appendChild()

删除:removeChild()

创建节点:createElement()

复制节点:cloneNode()

移动节点:应该是混合操作

/通过元素Id

修改方法:

添加:appendChild()

删除:removeChild()

创建节点:createElement()

复制节点:cloneNode()

移动节点:应该是混合操作

修改属性节点:setAttribute(“name”,“hhhh”)

通过选择器查找节点:document.querySelector("#demo")

对象的拷贝

浅拷贝没什么意义,分享一种常用拷贝方法,就是用json:

JSON.stringify() //转化为字符串
JSON.parse() //转化为对象

发布了23 篇原创文章 · 获赞 0 · 访问量 567

猜你喜欢

转载自blog.csdn.net/CSDN_Yong/article/details/104566976