6个js的知识点

作者 : 开心源码 本文共2135个字,预计阅读时间需要6分钟 发布时间: 2022-05-13 共217人阅读

1.立即执行函数

立即执行函数, 及immediately Invoked Function Express(IIFE), 正如它的名字,就是创立函数的同时立即执行,它没有绑定任何事件,也无需等待任何异步操作:

(function() {  // 代码..})();

function(){…} 是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。立即执行函数 也可以了解为立即调用一个匿名函数,最常见的场景就是: 将var变量的作用域限制于函数内,这样可以避免命名冲突

2.闭包

对于闭包(closure), 当外部函数返回之后,内部函数仍然可以访问外部函数的变量

function f1() {  var N = 0; // N是f1的局部变量  function f2() {    // f2 是 f1的内部函数,闭包    N += 1; // 内部函数f2中使用了外部函数f1中的变量N    console.log(N);  }  return f2;}var result = f1();result(); // 输出1result(); // 输出2result(); // 输出3

代码中,外部函数f1只执行了一次,变量N设为0, 并将内部函数f2赋值给了变量result。 因为外部函数 f1 已经执行完毕,其内部变量 N 应该在内存中被清理,而后事实并不是这样:我们每次调用 result 的时候,发现变量 N 一直在内存中,这就是闭包的神奇之处

3.使用闭包定义私有变量

通常,Javascript开发者使用下划线作为私有变量的前缀,但是实际上,这些变量仍然可以被访问和修改,并非真正的私有变量,这时,使用闭包可以定义真正的私有变量:

function Product() {  var name;  this.setName = function(value) {    name = value;  };  this.getName = function() {    return name;  };}var P = new Product();P.setName("zhouJin");console.log(P.name); // undefinedconsole.log(P.getName()); // zhouJin

代码中。对象P的name属性为私有属性,使用p.name不能直接访问

4.prototype

每个Javascript构造函数都有一个prototype 属性,用于设置所有的实例对象需要共享的属性和方法, prototype属性不能列举,JavaScript仅支持通过prototype属性进行继承属性和方法

function Rectangle(x, y) {  this._length = x;  this._breadth = y;}Rectangle.prototype.getDimensions = function() {  return {    length: this._length,    breadth: this._breadth  };};var a = new Rectangle(3, 4);var b = new Rectangle(4, 3);console.log(a.getDimensions()); // { length: 3, breadth: 4 }console.log(b.getDimensions()); // { length: 4, breadth: 3 }

代码中,a和b都是构造函数Rectangle创立的对象实例,它们通过prototype继承了getDimensions方法

5.模块化

JavaScript并非模块话编程语言,至少ES6落地之前都不是,然而对于一个复杂的web应用, 模块化编程时一个最基本的要求,这时,可以使用 立即执行 来实现模块化,正如很多JS库比方JQuery都是这样实现的

var module = (function() {  var N = 5;  function print(x) {    console.log("the result is:" + x);  }  function add(a) {    var x = a + N;    print(x);  }  return {    description: "This is description",    add: add  };})();console.log(module.description);  // 输出 This is descriptionmodule.add(5); // 输出 the result is:10

所谓模块化,就是根据需要控制模块内属性与方法的可访问性,即私有或者者公开,在代码中,module为一个独立的模块,N为其私有属性,print 为其私有方法,decription为其公有属性,add为其共有方法

6.变量提升

JavaScript会将所有变量和和函数公告移动到它的作用域前面,这就是所谓的变量提升,也就是说,无论你在什么地方公告变量和函数,解释器都会将他们移动到作用域的最前面,因而我们可以先使用变量和函数,然后公告它们,
但是,仅仅变量公告被提升了, 而变量赋值不会被提醒,假如不明白这点有时则会报错

console.log(y);  // 输出undefinedy = 2; // 初始化y

上面的代码等价于下面的代码

var y;  // 公告yconsole.log(y);  // 输出undefinedy = 2; // 初始化y

为了避免BUG,开发者应该在每个作用域开始时公告变量和函数

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 6个js的知识点

发表回复