大家好,我是南甫,前端爱好者一枚
如果喜欢我的文章,可以关注加点赞,一起成长吧
this的理解
1.this是一个关键字,它代表函数运行时,自动生成一个内部对象,只能在函数内部使用
2.作为纯粹的函数调用,this指向全局对象
3.作为对象的方法调用,this指向调用对象
4.作为构造函数被调用,this指向新的对象(new会改变this指向)
5.apply、call、bind调用this指向方法的第一个参数
js的内置对象
Object 是Javascript中所有对象的父对象
数据封装类对象:Object、Array、Boolean、Number、String
其他对象:Function、Argument、 Math、Date、RegExp、Error
表单验证传出的数据的过程
GET是从服务器请求数据、POST是发送数据到服务器。事实上,GET方法是把数据参数队列(query string)加到一个URL上,
值和表单是一一对应的,比如说name=john。在队列里,值和表单用一个&符号分开,空格用+号替换,特殊的符号转换成十六进制的代码。
因为这一队列在URL里面,这样队列的参数就能看到,可以被记录下来,或更改。通常GET方法还限制字符串大小(大概是256字节)
事实上POST方法可以没有时间限制的传送数据到服务器上,用户在浏览器是看不到这一过程的,所以POST方法比较适合用于发送一个
保密的(如信用卡号)或者比较大量的数据到服务器
区别:
POST是允许传输大量数据的方法,而GET方法会将所要传输的数据附在网址后面,然后一起送达服务器,因此传输的数据量就会受到限制,但是执行率却比POST方法好
总结:
1.get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式
2.在做数据查询时,建议用Get方式,而在做数据添加修改或删除时,建议用POST方式
所以:
表达如果是想服务器传输数据(如账号密码等)都是加密数据(post),如果只是单单想要从服务器获得数据或传输的数据并不重要,
可以直接用get
如何实现跨域
对于端口和协议的不同,只能通过后台来解决。我们要解决的是域名不同的问题
1.下面是用php设置的,*表示允许任何域向我们的服务端提交请求
header:{"Access-Control-Allow-Origin:*"}
2.JSONP(JSON with Padding 填充式JSON 或参数式JSON)
在js中,我们虽然不能直接用XMLHttpRequest请求不同域上的数据,但是在页面上引入不同域上的js脚本文件却是可以的,
jsonp正是利用这个特性实现的
3.JSONP由两部分组成:回调函数和数据。回调函数是当响应来到应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据

首先第一个script标签定义了一个处理数据的函数;
然后第二个script标签载入了一个js文件,"http://example.com/data.php" 是数据所在地址,但是因为是当做js来引入的,
所以"http://example.com/data.php"返回的必须是一个能执行的js文件
最后 js 文件载入成功后会执行我们在 url 参数中指定的函数,并且会把我们需要的 json 数据作为参数传入。所以 php 应该是这样的

优点
它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持,能够直接访问响应文本,
支持在浏览器与服务器之间双向通信
缺点
JSOPN是从其他域中加载代码执行。如果其他域不安全,很可能会在响应中夹带一些恶意代码,而此时除了完全放弃JSOPN的调用之外,
没有办法追究。因此在使用不是你自己运维的web服务时,一定得保证它的安全可靠。
它只支持get请求而不支持post等其他类型HTTP请求,它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行
JavaScrip调用的问题
什么是闭包
简单的说,作用域是针对变量的,比如我们创建了一个函数a1,函数里面又包了一个函数a2,此时就存在三个作用域:
全局作用域,a1作用域,a2作用域;即全局作用域包含了a1作用域,a1作用域包含了a2作用域。
当a2在查找变量时会先从自身的作用域查找,找不到再到上一级a1作用域查找,如果还没找到就到全局作用域查找,这样就形成了一个作用域链。
理解闭包首先要理解js垃圾回收机制,也就是当一个函数被执行完后,其作用域会被回收,如果形成了闭包,其作用域就不会被回收。
如果某个函数被它的父函数之外的一个变量引用,就会形成闭包。
闭包的作用,就是保存自己私有的变量,通过提供接口给外部使用,但外部不能访问内部的变量。
什么是原型链
JavaScript是面向对象的,每个实例对象都有一个__proto__属性,该属性指向它原型对象,这个实例对象的构造函数有一个原型prototype,
与实例的__proto__属性指向同一个对象。当一个对象在查找一个属性时,自身没有就会根据__proto__向他的原型查找,如果都没有,
则向他的原型继续查找,知道查到Object.prototype.__proto__为null,这样也就形成了原型链
实现继承的方法有什么
1.借用构造函数。也叫伪造对象或经典继承。
思路:在子类构造函数的内部调用超类型构造函数。可以通过使用apply()和call()方法在新创建的对象上执行构造函数。
缺点:方法都在构造函数中定义,函数的复用就无从谈起。在超类型的原型定义中的方法,对子类而言是不可见的,
结果所有的类型都只能使用构造函数模式

2.组合式继承。也叫伪经典继承。指的是将原型链额借用构造函数的技术组合到一起,从而发挥二者之长。
思路:使用原型链实现对原型属性属性和方法的继承,通过借用构造函数来实现实例属性的继承。
优点:既通过在原型上定义方法实现了函数复用,又能保证每一个实例都有自己的数组
组合继承避免了原型链和借用构造函数的缺陷,融合了他们的优点,成为JavaScript中常用的继承模式
3.原型链继承
思路:借助原型可以基于已有的对象创建对象,同时还不比因此创建自定义类型。
在Object()函数内部,先创建一个临时的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例
`Function object(o){
Function F(){};
F.prototype=o;
Return new F();
}`
4.寄生式继承
思路:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的是它做了左右工作一样返回对象
缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用降低效率,这一点和构造函数类似
`Function createAonter(original){
Var clone=object(original);
Clone.sayHi=function(){
Alert(“hi”);
} Return clone;
}`
5.寄生组合式继承。是JavaScript最常用的继承模式
思路:通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。
本质上,就是使用寄生式继承来继承超类型的原型,然后在将结果指定给子类型额原型。
开发人员普遍认为寄生组合式继承引用类型最理想的继承方式。
extend()方法才用了这样的方式
字符串的一些方法
charCodeAt() 返回一个整数,代表指定位置字符的Unicode编码
charAt() 返回指定索引位置处的字符串。如果超出有效范围的索引值返回空字符串
slice() 返回字符串的片段
substring() 返回位于String对象中指定位置的子字符串
substr() 返回一个从指定位置开始的指定长度的字符串
indexof() 返回String对象内第一次出现子字符串的位置,如果没有匹配到则返回-1
search() 返回与正则表达式查找内容匹配的第一个字符串的位置
concat() 返回字符串值,该值包含了两个或多个提供的字符串的链接
split() 将一个字符串分割为子字符串,然后将结果作为字符串数组返回
事件委派机制
事件委托,就是某个事情本来是自己干的,但是自己不干,交给别人来干。这就叫事件委派。比如:一个button对象,本来自己需要
监听点击事件,但是自己不来监听这个点击事件,让自己的父节点来监听自己的点击事件
好处:
A:提高性能:例如,当有很多li同时需要注册事件的时候,如果使用传统方法来注册改事件的话,需要给每一个li注册事件,而事件委派的话,就只需要将事件委托给一个ul元素即可。这样能提高性能。
B:新添加的元素还会有之前的事件
call和apply的区别
共同之处:
他们的共同之处:都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象
不同之处:
Apply:最多只能有两个参数--新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,
当然,即使只有一个参数,也要写进数组里面。如果argArray不是一个有效的数组或不是arguments对象,那么将导致一个TypeError。
如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数
Call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变
this指针。如果没有提供thisObj参数,那么Global对象被用作thisObj
简单的说,apply和call功能一样,只是传参不同,如:
func().call(func1,arg1,arg2,arg3)
func().apply(func1,[arg1,arg2,arg3])
欢迎大家一起交流评论
-To Be Continued-