标签:cte 核心 入参 sum return error 命名 oid 数据类型
一、函数
function add(a, b) { return a + b; }
fn(); // 1 function fn() {console.log(1)}
var add = function(a, b) { return a + b; };
fn(); // Uncaught TypeError: fn is not a function var fn = function(){console.log(1)};
var flag = true; if(flag) { function fn() { console.log(‘flag 为true‘) } } else{ function fn() { console.log(‘flag 为false‘) } } fn(); // chrome, firefox, ie11 输出 flag 为true // ie10及以下 输出 flag 为false
var flag = true; var fn; if(flag) { fn = function() { console.log(‘flag 为true‘); } } else{ fn = function() { console.log(‘flag 为false‘); } } fn() //chrome, firefox, ie7-11 均输出 flag 为true
var add = function f(a, b) { console.log(a + b); } add(1,2); // 3 f(1,2); // Uncaught ReferenceError: f is not defined var add = function f(a, b) { console.log(f); } console.log(add); add(3, 5); // ƒ f(a, b) { // console.log(f); // }
var add = new Function(‘a‘, ‘b‘, ‘return a + b‘);
public void add(int a, int b) { System.out.println(a + b); } public void add(int a, int b, int c) { System.out.println(a * b * c); } // 调用时,会根据传入参数的不同,而选择不同的方法,例如传入两个参数,就会调用第一个add方法
function add(a, b) { console.log(a + b); } function add(a, b, c) { c = c || 2; console.log(a * b * c); } add(1, 2); // 4 (直接调用最后一个同名的函数,并没有重载)
function fn() { console.log(‘hello‘) } fn() // hello
既然fn是一个函数指针,指代函数的代码段,那能否直接在代码段后面加一对圆括号呢?
function fn() { console.log(‘hello‘) }() // Uncaught SyntaxError: Unexpected token ) var fn = function() { console.log(‘hello‘) }() // hello
console.log(fn); // ƒ fn() {console.log(‘hello‘);} function fn() { console.log(‘hello‘); } // 在function关键字前面加一个合法的字符,结果就把fn当做一个未定义的变量了 console.log(fn); // Uncaught ReferenceError: fn is not defined +function fn() { console.log(‘hello‘); }
+function() { console.log(‘hello‘) }() -function() { console.log(‘hello‘) }() *function() { console.log(‘hello‘) }() /function() { console.log(‘hello‘) }() %function() { console.log(‘hello‘) }() // hello // hello // hello // hello // hello
(function() { console.log(‘hello‘); })(); (function() { console.log(‘hello‘); }()); // hello // hello
// 3! = 3*2*1 // 4! = 4*3*2*1 = 4*3! function factorial(num) { if(num <= 1) { return 1 } return num * factorial(num - 1) } console.log(factorial(5)) // 120 console.log(factorial(4)) // 24
function fn() { console.log(arguments.callee) } fn() // ƒ fn() { // console.log(arguments.callee) // } function factorial(num) { if(num <= 1) { return 1 } return num * arguments.callee(num - 1) } console.log(factorial(5)) // 120
‘use strict‘ function factorial(num) { if(num <= 1) { return 1 } return num * arguments.callee(num - 1) } console.log(factorial(5)) // Uncaught TypeError: ‘caller‘, ‘callee‘, and ‘arguments‘ properties may not be accessed on strict mode functions or the arguments objects for calls to them
var factorial = function jieCheng(num) { if(num <= 1) { return 1 } return num * jieCheng(num - 1) }; console.log(factorial(5)) // 120 var result = factorial; console.log(result(4)); // 24
function add(a, b) { console.log(a + b); } function sum1(a, b) { add.apply(window, [a, b]); } function sum2(a, b) { add.apply(this, arguments) } sum1(1, 2); // 3 sum2(3, 5); // 8
var color = ‘red‘; var obj = { color: ‘blue‘ }; function getColor() { console.log(this.color) } getColor.call(this) // red getColor.call(obj) // blue
二、预解析机制
var color = ‘red‘; var size = 31; function fn() { console.log(color); var color = ‘blue‘; var size = 29; } fn(); // undefined
console.log(fn) // ƒ fn() {} function fn() {} var fn = 32
console.log(fn); // undefined var fn = function() {}; var fn = 32; console.log(fn) // 32
console.log(fn); // ƒ fn() {console.log(‘你好 世界‘)} function fn() {console.log(‘hello world‘)} function fn() {console.log(‘你好 世界‘)}
预解析练习一:
var fn = 32 function fn() { alert(‘eeee‘) } console.log(fn) // 32 fn() // Uncaught TypeError: fn is not a function console.log(typeof fn) // number // 按照上面的预解析规则,预解析第一步时,fn会被赋值为 function fn() {alert(‘eeee‘)};第二步从上到下逐步执行时,由于函数fn声明提前,优于var声明的fn执行了, // 所以fn会被覆盖为一个Number类型的基本数据类型变量,而不是一个函数,其值为32
预解析练习二:
console.log(a); // function a() {console.log(4);} var a = 1; console.log(a); // 1 function a() { console.log(2); } console.log(a); // 1 var a = 3; console.log(a); // 3 function a() { console.log(4); } console.log(a); // 3 a(); // 报错:不是一个函数
var a = 1; function fn(a) { console.log(a); // 999 a = 2; console.log(a) // 2 } fn(999); console.log(a); // 1
var a = 1; function fn() { console.log(a); var a = 2; } fn(); // undefined console.log(a); // 1
var a = 1; function fn() { console.log(a); a = 2; } fn(); // 1 console.log(a); // 2
进击JavaScript核心 --- (2)函数和预解析机制
标签:cte 核心 入参 sum return error 命名 oid 数据类型
原文地址:https://www.cnblogs.com/rogerwu/p/10923375.html