너는 정말 함수를 아느냐?
함수 성명 방식
익명 함수
function 뒤에 괄호를 따라가면 중간에 함수 이름이 없는 것이 익명 함수입니다.let fn = function() {
console.log(' fn')
}
let fn2 = fn
console.log(fn.name) //fn
console.log(fn2.name)//fn,fn fn2 function。
구명 함수
function 뒤에 함수 이름이 있습니다. 괄호를 직접 따라가는 것이 아니라 구명 함수입니다.만약 구명 함수를 변수에 값을 부여한다면, 이 구명 함수의 작용역은 윈도우가 아니다.let fn = function fn1() {
console.log('function')
}
console.log(fn.name) //fn1
console.log(fn1,name) // ReferenceError: fn1 is not defined
화살표 함수
화살표 함수는 es6 지식점으로 다음과 같은 몇 가지 특징을 가지고 있다.
let fn = function() {
console.log(' fn')
}
let fn2 = fn
console.log(fn.name) //fn
console.log(fn2.name)//fn,fn fn2 function。
let fn = function fn1() {
console.log('function')
}
console.log(fn.name) //fn1
console.log(fn1,name) // ReferenceError: fn1 is not defined
let fn = e => e+1
console.log(fn(1)) //2
let fn1 = (i,y) => i+y
console.log(fn1(2,3)) //5
let fn2 = (i,y) => {
i+=1;
y+=2;
return i+y
}
console.log(fn2(5,6)) //13
문법 작용 영역 (정적 작용 영역)
정적 작용역은 어법 작용역이라고도 하는데 어법 작용역의 변수를 어법 변수라고 한다.어법 변수는 컴파일할 때 정태적으로 확정된 작용역을 가지고 있다.어법 변수의 작용역은 하나의 함수나 코드일 수 있으며, 이 변수는 이 코드 구역에서 볼 수 있다(visibility).이 영역 이외의 변수는 보이지 않거나 접근할 수 없습니다.어법 작용 영역에서 변수의 값을 가져올 때 함수 정의의 텍스트 환경을 검사하고 함수 정의를 포착할 때 이 변수에 대한 귀속을 검사합니다.
어법 작용역: 변수의 작용역은 정의할 때 결정하는 것이지 실행할 때 결정하는 것이 아니다. 즉, 어법 작용역은 원본 코드에 달려 있고 정적 분석을 통해 확정할 수 있기 때문에 어법 작용역도 정적 작용역이라고 한다.with와 eval을 제외하고는 JS의 작용역 메커니즘이 어법 작용역(Lexical scope)에 매우 가깝다고 말할 수 있습니다.
어법 작용역 트리를 통해 변수의 지향 관계를 판단할 수 있지만 변수의 값을 단정할 수 없다. 변수의 값은 집행 순서에 따라 더욱 판단해야 한다. 예를 들어 다음과 같다.
자바스크립트는 어법 작용역을 사용하기 때문에bian'liang의 작용역은 함수를 바탕으로 만든 위치로 호출할 때의 위치와 무관하다.var i = 1,
j = 2,
k = 3;
function a(o, p, x, q) {
var x = 4;
alert(i);
function b(r, s) {
var i = 11,
y = 5;
alert(i);
function c(t) {
var z = 6;
alert(i);
};
var d = function() {
alert(y);
};
c(60);
d();
};
b(40, 50);
}
a(10, 20, 30); //1 11 11 5
/**
* , function
*/
var SyntaxTree = {
//
window: {
variables:{
i:{ value:1},
j:{ value:2},
k:{ value:3}
},
functions:{
a: this.a
}
},
a:{
variables:{
x:'undefined'
},
functions:{
b: this.b
},
scope: this.window
},
b:{
variables:{
i:'undefined'
y:'undefined'
},
functions:{
c: this.c,
d: this.d
},
scope: this.a
},
c:{
variables:{
z:'undefined'
},
functions:{},
scope: this.b
},
d:{
variables:{},
functions:{},
scope: {
scope: this.b
}
}
};
/**
* :
*/
let ActiveObject = {
window: {
variables: {
i: { value: 1 }
j: { value: 2 }
k: { value: 3 }
},
functions: {
a: this.a
}
}
a: {
variables: {
x: { vale: 4 },
functions: {
b: this.b
},
scope: this.window,
params: {
o: { value: 10 },
p: { value: 20 },
x: this.variables.x
q: { vale: 'undefined' }
},
arguments: [this.params.o, this.params.p, this.params.x]
}
}
b: {
variables: {
i: { vale: 11 },
y: { vale: 5 },
},
functions: {
c: this.c,
d: this.d
},
params: {
r: { value: 40 }
s: { value: 50 }
},
arguments: [this.params.r, this.params.scope]
scope: this.a
}
c: {
variables: {
z: { value: 6 },
functions: {},
params: {
t: { value: 60 }
},
arguments: [this.params.t]
scope: this.b
}
}
d: {
variables: {},
functions: {},
params: {},
arguments: []
this.scope: this.b
}
}
call stack
콜 스택에 들어갈 때의 규칙:
var i = 1,
j = 2,
k = 3;
function a(o, p, x, q) {
var x = 4;
alert(i);
function b(r, s) {
var i = 11,
y = 5;
alert(i);
function c(t) {
var z = 6;
alert(i);
};
var d = function() {
alert(y);
};
c(60);
d();
};
b(40, 50);
}
a(10, 20, 30); //1 11 11 5
/**
* , function
*/
var SyntaxTree = {
//
window: {
variables:{
i:{ value:1},
j:{ value:2},
k:{ value:3}
},
functions:{
a: this.a
}
},
a:{
variables:{
x:'undefined'
},
functions:{
b: this.b
},
scope: this.window
},
b:{
variables:{
i:'undefined'
y:'undefined'
},
functions:{
c: this.c,
d: this.d
},
scope: this.a
},
c:{
variables:{
z:'undefined'
},
functions:{},
scope: this.b
},
d:{
variables:{},
functions:{},
scope: {
scope: this.b
}
}
};
/**
* :
*/
let ActiveObject = {
window: {
variables: {
i: { value: 1 }
j: { value: 2 }
k: { value: 3 }
},
functions: {
a: this.a
}
}
a: {
variables: {
x: { vale: 4 },
functions: {
b: this.b
},
scope: this.window,
params: {
o: { value: 10 },
p: { value: 20 },
x: this.variables.x
q: { vale: 'undefined' }
},
arguments: [this.params.o, this.params.p, this.params.x]
}
}
b: {
variables: {
i: { vale: 11 },
y: { vale: 5 },
},
functions: {
c: this.c,
d: this.d
},
params: {
r: { value: 40 }
s: { value: 50 }
},
arguments: [this.params.r, this.params.scope]
scope: this.a
}
c: {
variables: {
z: { value: 6 },
functions: {},
params: {
t: { value: 60 }
},
arguments: [this.params.t]
scope: this.b
}
}
d: {
variables: {},
functions: {},
params: {},
arguments: []
this.scope: this.b
}
}
콜 스택에 들어갈 때의 규칙:
/*
* example1:
*/
function test(a, b) {
/*
var a = 10
var b = undefined
1, 。
*/
console.log(a)
var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
}
test(10); // 10
/*
* example2:
*/
function test(a, b) {
console.log(a)
function a() {}
var e = function _e() {};
}
test(10); // ƒ a() {} . 2, , 。
function test(a, b) {
console.log(a)
var a = 30;
var a = function _e() {};
}
test(10); // 10 . 2, , 。
/*
* example3:
*/
console.log(foo);// foo , 3,
function foo(){
console.log("foo");
}
var foo = 1;
this와arguments
함수 호출
es5에서 함수는 네 가지 호출 방식이 있습니다.1. fn(p1,p2)
2. obj.fn(p1,p2)
3. fn.call(context,p1,p2)
4. fn.apply(context,p1,p2)
세 번째와 네 번째야말로 정상적인 js 함수 호출 방식이고 다른 두 가지는 문법 설탕이다.fn(p1,p2) fn.call(undefined,p1,p2) fn.apply(context,[p1,p2])
obj.fn(p1,p2) obj.fn.call(obj,p1,p2) obj.fn.apply(obj,[p1,p2])
만약 당신이 전송한context가null 또는undefined라면, 윈도우 대상은 기본context (엄격한 모드에서 기본context는undefined) 입니다
this가 뭐예요??
this는call의 첫 번째 매개 변수!!!var obj = {
foo: function(){
console.log(this)
}
}
var bar = obj.foo
obj.foo() // this obj
bar() // this window
obj.foo() obj.foo.call(obj) call , this, window。
bar() bar.call(undefined)
함수를 실행할 때,this는 숨겨진 매개 변수이며, 반드시 하나의 대상이어야 하며, 그렇지 않으면 js는 자동으로 그것을 대상으로 전환합니다.function fn() {
console.log(this)
console.log(arguments)
}
fn.call(1,2,3) // Number {1} [2,3]
arguments
arguments는 위조 그룹입니다. 이것은 Array와 유사하지만,length 속성과 색인 요소를 제외하고는 Array 속성이 없습니다.call과 apply 안에 첫 번째 파라미터를 제외하고는 모두arguments입니다. 만약arguments의 개수가 적으면call을 권장합니다. apply를 사용해도 됩니다. 확실하지 않으면 apply를 사용하십시오.방법을 사용하세요.arguments가 진정한 수조로 바뀝니다.var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments]
bind
Bind()에 대한 MDN 공식 문서의 정의:
The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.
대충 말하면bind는 새로운 함수를 되돌려줍니다. (원래 함수를 호출하지 않았습니다.) 이 새로운 함수는call 원래 함수입니다.call의 매개 변수는 당신이 결정합니다.예: this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
var retrieveX = module.getX;
var boundGetX = retrieveX.bind(module);
boundGetX(); // 81
retrieveX.bind(module)는 새로운 함수 boundGetX를 되돌려주고 이 새로운 함수를 호출할 때 이 함수 안에 있는this를module 대상에 연결하기 때문에this.x는 모듈에 해당한다.x는 81이다.
콜리화
컴퓨터 과학에서 커리화(영어: Currying)는 카리화 또는 가리화로 번역되어 여러 개의 파라미터를 받아들이는 함수를 하나의 단일 파라미터(최초 함수의 첫 번째 파라미터)를 받아들이는 함수로 바꾸고 나머지 파라미터를 받아들이고 결과를 되돌리는 새로운 함수로 바꾸는 기술이다.이 기술은 Moses Schönfinkel과 고트로브 프레그가 발명한 논리학자 하스켈 가리가 명명한 것이다.
한 가지 명백한 것은 함수에 일부 파라미터를 전달하여 하나의 함수로 돌아가 다른 파라미터를 처리하도록 하는 것이다. 예를 들어 세 개의 수의 합을 구한다.let addOne = function add(x) {
return function(y) {
return function(z) {
return x+y+z
}
}
}
let one = addOne(3)
console.log(one)//ƒ (y) {return function (z) {return x + y + z}}
let two = one(4)
console.log(two)//ƒ (z) {return x + y + z}
let three = two(5)
console.log(three)//12
javascript 함수 코리화 - 링크 상세 설명
고급 함수
수학과 컴퓨터 과학에서 고급 함수는 적어도 다음 조건을 만족시키는 함수이다.
1. fn(p1,p2)
2. obj.fn(p1,p2)
3. fn.call(context,p1,p2)
4. fn.apply(context,p1,p2)
fn(p1,p2) fn.call(undefined,p1,p2) fn.apply(context,[p1,p2])
obj.fn(p1,p2) obj.fn.call(obj,p1,p2) obj.fn.apply(obj,[p1,p2])
var obj = {
foo: function(){
console.log(this)
}
}
var bar = obj.foo
obj.foo() // this obj
bar() // this window
obj.foo() obj.foo.call(obj) call , this, window。
bar() bar.call(undefined)
function fn() {
console.log(this)
console.log(arguments)
}
fn.call(1,2,3) // Number {1} [2,3]
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments]
Bind()에 대한 MDN 공식 문서의 정의:
The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.
대충 말하면bind는 새로운 함수를 되돌려줍니다. (원래 함수를 호출하지 않았습니다.) 이 새로운 함수는call 원래 함수입니다.call의 매개 변수는 당신이 결정합니다.예:
this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
var retrieveX = module.getX;
var boundGetX = retrieveX.bind(module);
boundGetX(); // 81
retrieveX.bind(module)는 새로운 함수 boundGetX를 되돌려주고 이 새로운 함수를 호출할 때 이 함수 안에 있는this를module 대상에 연결하기 때문에this.x는 모듈에 해당한다.x는 81이다.
콜리화
컴퓨터 과학에서 커리화(영어: Currying)는 카리화 또는 가리화로 번역되어 여러 개의 파라미터를 받아들이는 함수를 하나의 단일 파라미터(최초 함수의 첫 번째 파라미터)를 받아들이는 함수로 바꾸고 나머지 파라미터를 받아들이고 결과를 되돌리는 새로운 함수로 바꾸는 기술이다.이 기술은 Moses Schönfinkel과 고트로브 프레그가 발명한 논리학자 하스켈 가리가 명명한 것이다.
한 가지 명백한 것은 함수에 일부 파라미터를 전달하여 하나의 함수로 돌아가 다른 파라미터를 처리하도록 하는 것이다. 예를 들어 세 개의 수의 합을 구한다.let addOne = function add(x) {
return function(y) {
return function(z) {
return x+y+z
}
}
}
let one = addOne(3)
console.log(one)//ƒ (y) {return function (z) {return x + y + z}}
let two = one(4)
console.log(two)//ƒ (z) {return x + y + z}
let three = two(5)
console.log(three)//12
javascript 함수 코리화 - 링크 상세 설명
고급 함수
수학과 컴퓨터 과학에서 고급 함수는 적어도 다음 조건을 만족시키는 함수이다.
let addOne = function add(x) {
return function(y) {
return function(z) {
return x+y+z
}
}
}
let one = addOne(3)
console.log(one)//ƒ (y) {return function (z) {return x + y + z}}
let two = one(4)
console.log(two)//ƒ (z) {return x + y + z}
let three = two(5)
console.log(three)//12
수학과 컴퓨터 과학에서 고급 함수는 적어도 다음 조건을 만족시키는 함수이다.
/*
*
*/
1. Array.prototype.filter()
2. Array.prototype.forEach()
3. Array.prototype.reduce()
4. Array.prototype.map()
5. Array.prototype.find()
6. Array.prototype.every()
/*
*
*/
1. fn.bind(args)
리셋 함수
함수 A는 매개 변수(함수 참조)로 다른 함수 B에 전달되고 이 함수 B는 함수 A를 실행합니다.우리는 함수 A를 리셋 함수라고 말한다.이름 (함수 표현식) 이 없으면 익명 리셋 함수라고 합니다.
명사 형식: 매개 변수로 간주되는 함수는 바로 리셋 동사 형식입니다. 이 리셋을 호출하면 리셋은 비동기와 아무런 관계가 없습니다.
리셋 함수의 사용 장소
리셋 함수의 전달
전달 방식은 두 가지가 있는데 함수 인용과 함수 표현식이다.
$.get('myhtmlpage.html', myCallBack);//
$.get('myhtmlpage.html', myCallBack('foo', 'bar'));// , ?
$.get('myhtmlpage.html', function(){//
myCallBack('foo', 'bar');
});
화살표 함수와es5의 함수 주요 차이
화살표 함수의 주요 차이는this에 있다. 화살표 함수는this라는 개념이 없다. 예를 들어 다음과 같다.setTimeout(function(a){
console.log(this) // this {name:'Jack'}
setTimeout(function(a){
console.log(this) // this window, bind, setTimeout window
},1000)
}.bind({name:'Jack'}),1000)
setTimeout(function(a){
console.log(this) // this {name:'Jack'}
setTimeout(function(a){
console.log(this) // this {name: "Jack"}, bind this {name: "Jack"}
},1000)
}.bind({name:'Jack'}),1000)
setTimeout(function(a){
console.log(this) // this {name:'Jack'}
setTimeout(a=>console.log(this),1000)// this {name:'Jack'}, this , this this, {name:'Jack'}
}.bind({name:'Jack'}),1000)
이로써 기본적으로 js의 모든 함수 내용을 말했습니다. 간단하게 예를 들면 더욱 깊이 있는 연구는 다른 사나이의 블로그를 봐야 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
setTimeout(function(a){
console.log(this) // this {name:'Jack'}
setTimeout(function(a){
console.log(this) // this window, bind, setTimeout window
},1000)
}.bind({name:'Jack'}),1000)
setTimeout(function(a){
console.log(this) // this {name:'Jack'}
setTimeout(function(a){
console.log(this) // this {name: "Jack"}, bind this {name: "Jack"}
},1000)
}.bind({name:'Jack'}),1000)
setTimeout(function(a){
console.log(this) // this {name:'Jack'}
setTimeout(a=>console.log(this),1000)// this {name:'Jack'}, this , this this, {name:'Jack'}
}.bind({name:'Jack'}),1000)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.