菜鸟教程 之 JavaScript 函数(function)

 

From:https://www.runoob.com/js/js-function-definition.html

 

 

JavaScript 函数定义

 

JavaScript 使用关键字 function 定义函数。

  • 函数 可以 通过声明定义
  • 函数 也可以 是一个表达式

 

函数声明

分号 是用来分隔可执行 JavaScript 语句。

由于函数声明不是一个可执行语句,所以不以分号结束。

函数声明的语法 :

function functionName(parameters) {// 执行的代码
}

示例:

// 函数声明和定义
function myFunction(a, b) {return a * b;
}var result = myFunction(10, 20);  // 函数调用
console.log(result);

 

函数表达式

JavaScript 函数可以通过一个表达式定义。

函数表达式可以存储在变量中:

var x = function (a, b) {return a * b};

在函数表达式存储在变量后,变量也可作为一个函数使用:

var x = function (a, b) {return a * b};
var z = x(4, 3);    // 以分号结尾,因为它是一个执行语句。

 

匿名函数

以上函数实际上是一个 匿名函数 ( 函数没有名称 )。

函数存储在变量中,不需要函数名称,通常通过变量名来调用。

 

Function() 构造函数

在 JavaScript 中,很多时候,你需要避免使用 new 关键字。 

在以上实例中,我们了解到函数通过关键字 function 定义。

函数同样可以通过内置的 JavaScript 函数构造器(Function())定义。

var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);

实际上,你不必使用构造函数。上面实例可以写成:

var myFunction = function (a, b) {return a * b};
var x = myFunction(4, 3);

 

函数提升(Hoisting)

在之前的教程中我们已经了解了 "hoisting(提升)"。

  • 提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为。
  • 提升(Hoisting)应用在:变量的声明函数的声明

因此,函数可以在声明之前调用:

myFunction(5);function myFunction(y) {return y * y;
}

使用 表达式定义函数 时 无法提升。

 

自调用函数

  • 函数表达式 ( 匿名函数 ) 可以 "自调用"。
  • 自调用表达式自动调用自己
  • 如果 函数表达式 后面紧跟 ()  同时加上 分号,则会自动调用。
  • 声明的函数 不能 自调用(即 不能自动调用自己)。

语法:( 函数表达式,即匿名函数 ) ( );  // 最后的 分号 不能少,表示是一个语句

(function () {var x = "Hello!!";      // 我将调用自己
})();

以上函数实际上是一个 匿名自我调用的函数 (没有函数名)。

 

函数可作为一个值使用

JavaScript 函数作为一个值使用:

function myFunction(a, b) {return a * b;
}var x = myFunction(4, 3);

JavaScript 函数可作为表达式使用:

function myFunction(a, b) {return a * b;
}var x = myFunction(4, 3) * 2;

 

函数是对象

  • 在 JavaScript 中使用 typeof 操作符判断 函数类型 将返回 "function" 。
  • 但是把 JavaScript 函数描述为一个对象更加准确。
  • JavaScript 函数有 属性 和 方法
  • arguments.length 属性返回函数调用过程接收到的参数个数:
function myFunction(a, b) {return arguments.length;
}

toString() 方法将函数作为一个字符串返回:

function myFunction(a, b) {return a * b;
}var txt = myFunction.toString();
console.log(txt);
/*
输出结果:
function myFunction(a, b) {return a * b;
}
* */

注意 函数 方法 的区别:

  • 函数:不属于对象的函数,即普通函数,叫做 函数
  • 方法:如果一个函数属于对象,则这个函数 叫做 方法

 

 

箭头函数

ES6 新增了箭头函数。

箭头函数表达式的语法比普通函数表达式更简洁。

(参数1, 参数2, …, 参数N) => { 函数声明 }(参数1, 参数2, …, 参数N) => 表达式(单一)
// 相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }

当只有一个参数时,圆括号是可选的:

(单一参数) => {函数声明}
单一参数 => {函数声明}

没有参数的函数应该写成一对圆括号:

() => {函数声明}

示例:

// ES5
var x = function(x, y) {return x * y;
}// ES6
const x = (x, y) => x * y;

有的箭头函数都没有自己的 this。 不适合定义一个 对象的方法

当我们使用箭头函数的时候,箭头函数会默认帮我们绑定外层 this 的值,所以在箭头函数中 this 的值和外层的 this 是一样的。

箭头函数是不能提升的,所以需要在使用之前定义。

使用 const 比使用 var 更安全,因为 函数表达式始终是一个常量

如果函数部分只是一个语句,则可以省略 return 关键字和大括号 {},这样做是一个比较好的习惯:

const x = (x, y) => { return x * y };
console.log(x(5, 5));

 

 

JavaScript 函数参数

 

JavaScript 函数对参数的值没有进行任何的检查。

  • 函数显式参数 ( 形参 ):在函数定义时列出。
  • 函数隐式参数 ( 实参 ):在函数调用时传递给函数真正的值。

 

函数显式参数(Parameters)与隐式参数(Arguments)

在先前的教程中,我们已经学习了函数的显式参数:

function funcName(parameter1, parameter2, parameter3) {// 要执行的代码……
}

 

参数规则

  • 形参:JavaScript 函数定义显式参数 ( 形参 ) 时 指定数据类型。( 即 不指定 形参 的 数据类型,啥类型都可以 )
  • 实参:JavaScript 函数对隐式参数 ( 实参进行类型检测。 ( 即 不检测 实参 的 数据类型 ,想传递什么类型就传递什么类型)
  • 参数个数:JavaScript 函数对隐式参数 ( 实参 ) 的个数不进行检测。( 即 不检查 传递的 实参个数,想传递多少个实参都可以。  )

 

默认参数

ES5中,如果函数在调用时未提供隐式参数,参数会默认设置为: undefined

有时这是可以接受的,但是建议最好为参数设置一个默认值:

function myFunction(x, y) {if (y === undefined) {y = 0;} 
}

或者,更简单的方式:( 如果 y 已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。 )

function myFunction(x, y) {y = y || 0;
}

如果函数调用时设置了过多的参数,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用。

 

ES6 函数可以自带参数

ES6 支持函数带有默认参数,就判断 undefined 和 || 的操作:

function myFunction(x, y = 10) {// y is 10 if not passed or undefinedreturn x + y;
}myFunction(0, 2) // 输出 2
myFunction(5); // 输出 15, y 参数的默认值

 

arguments 对象

JavaScript 函数有个内置的对象 arguments 对象。argument 对象包含了函数调用的参数数组。通过这种方式你可以很方便的找到最大的一个参数的值:

x = findMax(1, 123, 500, 115, 44, 88);function findMax() {var i, max = arguments[0];if (arguments.length < 2) return max;for (i = 0; i < arguments.length; i++) {if (arguments[i] > max) {max = arguments[i];}}return max;
}x = findMax(1, 123, 500, 115, 44, 88);
console.log(x)

或者创建一个函数用来统计所有数值的和:

x = sumAll(1, 123, 500, 115, 44, 88);function sumAll() {var i, sum = 0;for (i = 0; i < arguments.length; i++) {sum += arguments[i];}return sum;
}
console.log(x)

 

参数 的 值传递

调用函数时,传递给函数的参数叫做 实参,即 隐式参数

JavaScript 隐式参数通过值来传递:函数仅仅只是获取值。

如果函数修改参数的值,不会修改显式参数的初始值(在函数外定义)。

隐式参数的改变在函数外是不可见的。

 

参数 的 对象传递

在JavaScript中,可以引用对象的值。

因此我们在函数内部修改对象的属性就会修改其初始的值。

修改对象属性可作用于函数外部(全局变量)。

修改对象属性在函数外是可见的。

示例:


var person = {'name': 'king','age': 100,'sex': '男'
}
console.log("111111111111111111111111111")
console.log(person)
function myFunction(argPerson) {argPerson.name = '皇帝';argPerson.age = 123;console.log("22222222222222222222222222222")console.log(argPerson);
}
myFunction(person);
console.log("33333333333333333333333333333")
console.log(person);

 

 

JavaScript 函数调用

 

函数调用 就是 执行函数中的代码。

JavaScript 函数有 4 种调用方式。每种方式的不同在于 this 的初始化。

 

this 关键字

一般而言,在 Javascript 中,this 指向函数执行时的当前对象。

 

作为一个函数调用

function myFunction(a, b) {return a * b;
}
myFunction(10, 2);    // myFunction(10, 2) 返回 20

以上函数不属于任何对象。但是在 JavaScript 中它始终是默认的全局对象
在 HTML 中默认的全局对象是 HTML 页面本身,所以函数是属于 HTML 页面。
在浏览器中的页面对象是浏览器窗口(window 对象)。以上函数会自动变为 window 对象的函数。 

下面代码中 myFunction()window.myFunction() 是一样的:

function myFunction(a, b) {return a * b;
}
window.myFunction(10, 2);    // window.myFunction(10, 2) 返回 20

上面代码中是调用 JavaScript 函数常用的方法, 但不是良好的编程习惯。全局变量,方法或函数容易造成命名冲突的bug。

 

全局对象

当函数没有被自身的对象调用时 this 的值就会变成全局对象。在 web 浏览器中全局对象是浏览器窗口(window 对象)。

该实例返回 this 的值是 window 对象:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body><p>在 HTML 中 <b>this</b> 的值, 在全局函数是一个 window 对象。</p>
<p id="demo"></p>
<script>
function myFunction() {return this;
}
document.getElementById("demo").innerHTML = myFunction(); 
</script></body>
</html>

函数作为全局对象调用,会使 this 的值成为全局对象。 使用 window 对象作为一个变量容易造成程序崩溃。

 

函数作为方法调用

在 JavaScript 中你可以将函数定义为对象的方法。

以下实例创建了一个对象 (myObject), 对象有两个属性 (firstName 和 lastName), 及一个方法 (fullName):

var myObject = {firstName:"John",lastName: "Doe",fullName: function () {return this.firstName + " " + this.lastName;}
}
myObject.fullName();         // 返回 "John Doe"

fullName 方法是一个函数。函数属于对象。 myObject 是函数的所有者。

this 对象,拥有 JavaScript 代码。实例中 this 的值为 myObject 对象。

测试以下!修改 fullName 方法并返回 this 值:

var myObject = {firstName:"John",lastName: "Doe",fullName: function () {return this;}
}
console.log(myObject.fullName());          // 返回 [object Object] (所有者对象)

函数作为对象方法调用,会使得 this 的值成为对象本身。

 

使用构造函数调用函数

如果函数调用前使用了 new 关键字, 则是调用了构造函数。

这看起来就像创建了新的函数,但实际上 JavaScript 函数是重新创建的对象:

// 构造函数:
function myFunction(arg1, arg2) {this.firstName = arg1;this.lastName = arg2;
}// This creates a new object
var x = new myFunction("John", "Doe");
console.log(x.firstName);    // 返回 "John"

构造函数的调用会创建一个新的对象。新对象会继承构造函数的属性和方法。

构造函数中 this 关键字没有任何的值。
this 的值在函数调用实例化对象(new object)时创建。

 

作为函数方法调用函数

在 JavaScript 中, 函数是对象。JavaScript 函数有它的属性和方法。

call() 和 apply() 是预定义的函数方法。 两个方法可用于调用函数,两个方法的第一个参数必须是对象本身。

function myFunction(a, b) {return a * b;
}
myObject = myFunction.call(myObject, 10, 2);     // 返回 20
function myFunction(a, b) {return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray);  // 返回 20

两个方法都使用了对象本身作为第一个参数。 两者的区别在于第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

在 JavaScript 严格模式(strict mode)下, 在调用函数时第一个参数会成为 this 的值, 即使该参数不是一个对象。

在 JavaScript 非严格模式(non-strict mode)下, 如果第一个参数的值是 null 或 undefined, 它将使用全局对象替代。

通过 call() 或 apply() 方法你可以设置 this 的值, 且作为已存在对象的新方法调用。

 

call() 和 apply() 用法总结

一般来说,this 总是指向调用某个方法的对象,但是使用 call() 和 apply()方法时,就会改变 this 的指向

先看明白下面:例 1

var name = '小王', age = 17;
var obj = {name: '小张',objAge:this.age,myFun:function () {console.log(this.name + "年龄" + this.age);}
}var obj_age = obj.objAge;  
console.log(obj_age);
obj.myFun();

例 2

var tempStr = "扫地僧";
function showStr(){console.log(this.tempStr);
}
showStr();

比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;

 

1,call()、apply()、bind() 都是用来重定义 this 这个对象的!

var name = '小王', age = 17;
var obj = {name: '小张',objAge:this.age,myFun:function () {console.log(this.name + "年龄" + this.age);}
}
var db = {name: '德玛',age: 99
}obj.myFun.call(db);    // 德玛年龄 99
obj.myFun.apply(db);    // 德玛年龄 99
obj.myFun.bind(db)();   // 德玛年龄 99

注意:bind 方法后面多了个 () 外 ,结果返回都一致!bind 返回的是一个新的函数,你必须调用它才会被执行

 

2,对比 call 、bind 、 apply 传参情况下

var name = '小王', age = 17;
var obj = {name: '小张',objAge:this.age,myFun:function () {console.log(this.name + "年龄" + this.age);}
}
var db = {name: '德玛',age: 99
}obj.myFun.call(db,'成都','上海');      // 德玛 年龄 99  来自 成都去往上海
obj.myFun.apply(db,['成都','上海']);      // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,'成都','上海')();       // 德玛 年龄 99  来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99  来自 成都, 上海去往 undefined

call 、bind 、 apply 这三个函数的参数:

  • 第一个参数:都是 this 的指向对象,
  • 第二个参数差别就来了:
        call 的参数是直接放进去的,参数之间全都用逗号分隔。 obj.myFun.call(db,'成都', ... ,'string' )。
        apply 的所有参数都必须放在一个数组里面。 obj.myFun.apply(db, ['成都', ..., 'string' ])。
        bind 除了返回是函数以外,它的参数和 call 一样。

当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!

JS 中的 call() 方法和 apply() 方法用法总结:https://blog.csdn.net/ganyingxie123456/article/details/70855586

 

 

笔记:

this 是 JavaScript 语言的一个关键字。

它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如:

function test() {this.x = 1;
}

随着函数使用场合的不同,this 的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

作为函数方法调用函数时,此函数执行了相当于 java 中静态函数的功能。( 尝试一下 )

<script>
var myObject, myArray;
myObject={name: "hahaha ",hsk: "en"
};
function myFunction(a, b) {alert(this);return this.name +this.hsk;
}
myArray = [10, 2]
myObject = myFunction.apply(myObject, myArray);       
document.getElementById("demo").innerHTML = myObject; 
</script>

可以用的频率较高的函数作这样的设置,为对象执行相关操作。

 

 

JavaScript 的 闭包

 

JavaScript 变量可以是 局部变量全局变量

私有变量 可以用到 闭包

 

局部变量

在函数内声明的变量作用域是局部的(函数内):

var globalVar;  // 全局变量// 这里不能使用 carName 变量function myFunction() {var carName = "Volvo";  // 函数内的局部变量// 这里可以使用 carName 变量
}// 这里不能使用 carName 变量

函数内

  • 使用 var 声明的变量 只能在函数内容访问,即 局部变量

  • 如果 不使用 var 则是 全局变量,即便它在函数内定义

局部变量 只能在定义它的函数内部使用。

全局变量局部变量 即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值。

 

全局变量

函数可以访问由函数内部定义的变量,如:

function myFunction() {var a = 4;return a * a;
}

函数也可以访问函数外部定义的变量,如:

var a = 4;
function myFunction() {return a * a;
}

后面一个实例中, a 是一个 全局 变量。

在web页面中全局变量属于 window 对象。

全局变量可应用于页面上的所有脚本。

在第一个实例中, a 是一个 局部 变量。

 

变量生命周期

全局变量的作用域是全局性的,即在整个JavaScript程序中,全局变量处处都在。

而在函数内部声明的变量,只在函数内部起作用。这些变量是局部变量,作用域是局部性的;函数的参数也是局部性的,只在函数内部起作用。

 

计数器困境

设想下如果你想统计一些数值,且该计数器在所有函数中都是可用的。

你可以使用全局变量,函数设置计数器递增:

var counter = 0;function add() {return counter += 1;
}add();
add();
add();// 计数器现在为 3

计数器数值在执行 add() 函数时发生变化。

但问题来了,页面上的任何脚本都能改变计数器,即便没有调用 add() 函数。

如果我在函数内声明计数器,如果没有调用函数将无法修改计数器的值:

function add() {var counter = 0;return counter += 1;
}add();
add();
add();// 本意是想输出 3, 但事与愿违,输出的都是 1 !

以上代码将无法正确输出,每次我调用 add() 函数,计数器都会设置为 1。

JavaScript 内嵌函数可以解决该问题。

 

JavaScript 内嵌函数

所有函数都能访问全局变量。  

实际上,在 JavaScript 中,所有函数都能访问它们上一层的作用域

JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。

该实例中,内嵌函数 plus() 可以访问父函数的 counter 变量:

function add() {var counter = 0;function plus() {counter += 1;}plus();    return counter; 
}

如果我们能在外部访问 plus() 函数,这样就能解决计数器的困境。

我们同样需要确保 counter = 0 只执行一次。

我们需要闭包。

 

JavaScript 闭包

还记得函数自我调用吗?该函数会做什么?

var add = (function () {var counter = 0;return function () {return counter += 1;}
})();add();
add();
add();// 计数器为 3

 

实例解析

变量 add 指定了函数自我调用的返回字值。

自我调用函数只执行一次。设置计数器为 0。并返回函数表达式。

add变量可以作为一个函数使用。非常棒的部分是它可以访问函数上一层作用域的计数器。

这个叫作 JavaScript 闭包。它使得函数拥有私有变量变成可能。

计数器受匿名函数的作用域保护,只能通过 add 方法修改。

闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。

直观的说:就是形成一个不销毁的栈环境。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度研报:六大视角解读人工智能,AI岂止于技术

来源&#xff1a; 亿欧摘要&#xff1a; 人工智能只是一项新技术吗&#xff1f;从任一角度诠释AI&#xff0c;都是狭隘并且不完整的。亿欧智库在最新发布的研究报告中&#xff0c;总结两年来的研究成果&#xff0c;从学界、企业、投资、国家等六大视角对人工智能进行了全面解读…

为什么有的机器学习应用公司必将失败?

作者 | Cassie Kozyrkov编译 | Leo出品 | 人工智能头条摘要&#xff1a;告诉大家一个秘密&#xff1a;当人们说起“ 机器学习 ”时&#xff0c;听起来好像只是在谈论一门学科&#xff0c;但其实是两门。如果企业不了解其中的差异&#xff0c;那么就可能招惹来满世界的麻烦。两个…

[转]迭代、集合、字典表和列表

集合在编程的过程中用的是非常的多&#xff0c;如GridViewRowCollection、ConnectionStringSettingsCollection、NameValueCollection等等。一般来说&#xff0c;集合的类都包含在System.Collections命名空间中。那众多集合之间又有什么样的联系呢&#xff1f;这需要我们从集合…

菜鸟教程 之 HTML DOM 和 浏览器BOM

HTML DOM&#xff1a;https://www.runoob.com/js/js-htmldom.html 浏览器对象模型 (BOM)&#xff1a;https://www.runoob.com/js/js-window.html DOM、DOCUMENT、BOM、WINDOW 有什么区别? &#xff1a;https://www.zhihu.com/question/33453164 通过 HTML DOM&#xff0c;Ja…

IBM:物联网应重启,否则注定会失望

来源&#xff1a;IBM商业价值研究院摘要&#xff1a;尽管技术推动着物联网向前发展&#xff0c;但与此同时&#xff0c;缺少有吸引力且可持续盈利的商业模式将阻碍物联网的发展。如果未来的商业模式不同于目前硬件和软件平台的商业模式&#xff0c;那么&#xff0c;它是什么样的…

联通、华为《5G室内覆盖》白皮书!

来源&#xff1a;5G摘要&#xff1a;近日&#xff0c;中国联通、华为联合发布了《面向5G的室内覆盖数字化演进白皮书》。干货报告未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#…

JavaScript 执行机制

前端开发&#xff0c;一篇文章让你彻底搞懂&#xff0c;什么是JavaScript执行机制&#xff01;&#xff1a;https://zhuanlan.zhihu.com/p/139261821 大白话讲解 JavaScript 执行机制&#xff0c;一看就懂&#xff1a;https://www.jianshu.com/p/22641c97e351 JavaScript 运行…

互联网大脑进化简史,华为云EI智能体加入-2018年7月新版

要&#xff1a;华为云EI智能体是2018年以来产生的第八个类脑智能巨系统&#xff0c;在中国&#xff0c;目前除了小米、联想、今日头条&#xff0c;几乎所有的互联网巨头都提出了自己的”大脑“系统建设计划。1969年互联网诞生以来&#xff0c;网状模型一直是互联网最基础和重要…

Windows 必备神器 Cmder 使用教程

From&#xff1a;终端利器Cmder&#xff1a;https://www.e-learn.cn/topic/3885768 1. 安装 Cmder 打开 Cmder官网&#xff08; https://cmder.net &#xff09;&#xff0c;下拉页面找到 Download 项选择下载&#xff0c;下载的时候&#xff0c;两个版本&#xff0c;分别是 mi…

T-SQL查询进阶--流程控制语句

概述 和其他高级语言一样&#xff0c;T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解&#xff0c;本篇文章会系统的对T-SQL语句中的流程控制语句…

潘建伟团队首次实现18个光量子比特纠缠,刷新世界记录

来源&#xff1a;澎湃网摘要&#xff1a;中国科学技术大学潘建伟教授及其同事陆朝阳、刘乃乐、汪喜林等通过调控六个光子的偏振、路径和轨道角动量三个自由度&#xff0c;在国际上首次实现18个光量子比特的纠缠&#xff0c;刷新了所有物理体系中最大纠缠态制备的世界纪录。中国…

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

From&#xff1a;Frida hook 常用函数分享&#xff1a;https://www.52pojie.cn/thread-1196917-1-1.html From&#xff1a;Frida Hook Android 常用方法&#xff1a;https://blog.csdn.net/zhy025907/article/details/89512096 Frida 使用&#xff1a;https://zhuanlan.zhihu.c…

资本|五大科技巨头并购投资布局分析

来源&#xff1a;199IT互联网数据中心就买进而言&#xff0c;科技巨头可能是一个理想的收购方。Alphabet、亚马逊、苹果、Facebook和微软拥有巨大的市场价值&#xff08;3.9万亿美元&#xff09;。综合来看&#xff0c;五大科技巨头在整个并购市场占有相对较小的份额。下图显示…

安装 Chrome 插件:Stylish、xStyle​、Tampermonkey、SwitchyOmega

安装 Chrome 插件 3 种方法 方法 1&#xff1a;直接通过 chrome 插件商店安装&#xff0c;google 插件商店因为 "都懂的" 原因无法访问&#xff0c;如果会 "高科技" 上网可以忽略。直接通过插件商店安装方法 2&#xff1a;如果不会 "高科技" 上网…

数据库管理工具 Navicat 和 DBeaver

Navicat “Navicat” 是一套可创建多个连接的数据库管理工具&#xff0c;用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和/或 MongoDB 等不同类型的数据库&#xff0c;并支持管理某些云数据库&#xff0c;例如阿里云、‎腾讯云。Navicat 和 Navicat …

百度Apollo发布中国首个自动驾驶安全报告,L3级别产品2020年量产上市

来源&#xff1a;雷锋网去年 10 月&#xff0c;全球自动驾驶研发先行者 Waymo 发布了长达 43 页的安全报告&#xff0c;里面详细说明了如何装备和训练自动驾驶车辆&#xff0c;从而避免驾驶过程中一些意外情况的发生。今年 1 月&#xff0c;美国车企巨头通用也发布了“2018 自动…

Chrome Devtools 高级调试指南

From ( Chrome Devtools 高级调试指南 )&#xff1a;https://juejin.cn/post/6844903961472974855 chrome devtools 设置黑色主题&#xff1a;https://blog.csdn.net/sinat_15347975/article/details/81151342 Chrome DevTools 实用技巧大全&#xff08;收藏&#xff09;&…

包揽全球50%以上份额,中美发力超级计算

来源&#xff1a;第一财经摘要&#xff1a;中国已经成为全球拥有最多超级计算机的国家。根据上周发布的一份最新榜单&#xff0c;全球排名前500强的超级计算机中&#xff0c;有206台是中国研制的&#xff1b;而美国仅拥有124台。多年来&#xff0c;美国长期主导着超级计算机市场…

Fiddler 抓包工具总结

From&#xff1a;https://www.cnblogs.com/yyhh/p/5140852.html 官方文档&#xff1a;https://www.telerik.com/support/fiddler Fiddler 调式使用 (一) --- 深入研究&#xff1a;https://www.cnblogs.com/tugenhua0707/p/4637771.html Fiddler 实战 --- 深入研究(二)&#…

云计算行业报告:2018, 风起云涌

来源&#xff1a;物联网智库摘要&#xff1a;依托弹性扩展、费用低、速度快的优势&#xff0c;云计算颠覆了传统IT架构&#xff0c;未来将成为主流的IT架构。多优势助力云计算颠覆传统IT服务架构经过十几年的发展&#xff0c;云计算已经形成了较为完善的生态系统&#xff0c;构…