javascript 고수분들 궁금합니다.

// library.js
const checkAvailability = (itemName, distributorName) => {
    console.log(`Checking availability of ${itemName} at ${distributorName}...`);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (restockSuccess()) {
                console.log(`${itemName} are in stock at ${distributorName}`)
                resolve(itemName);
            } else {
                reject(`Error: ${itemName} is unavailable from ${distributorName} at this time.`);
            }
        }, 1000);
    });
};

module.exports = { checkAvailability };


// This is a function that returns true 80% of the time
// We're using it to simulate a request to the distributor being successful this often
function restockSuccess() {
    return (Math.random() > .2);
}

자바스크립트를 공부하면서 보는데 자바스크립트가 modules.exports 로 저장한 object 만 다른 파일에서 사용가능하다고 알고있는데 여기서 보면 restockSuccess 함수는 modules.exports 에 할당하지 않은 함수로 되어있는걸로 저는 보고 있거든요 밑에 코드가 checkAvailability 함수를 쓰려고 request(’./library.js’) 사용해서 쓴 코드 거든요? 제의문은 이렇게 다른파일에서 쓸때 checkAvailability 함수안에서 restockSuccess() 함수를 이용해서 랜덤값을 만들어서 사용할려면 이함수가 그파일에 정의되어있어야 될텐데 안된 상태인거 아닌가요? request() 를 쓴다면 library 파일안에 있는 모든함수가 일단 app.js 로 불러와진 상태 인건가요?

// app.js
const {checkAvailability} = require('./library.js');

const onFulfill = (itemsArray) => {
  console.log(`Items checked: ${itemsArray}`);
  console.log(`Every item was available from the distributor. Placing order now.`);
};

const onReject = (rejectionReason) => {
	console.log(rejectionReason);
};

// Write your code below:
const checkSunglasses = checkAvailability('sunglasses', 'Favorite Supply Co.');
const checkPants = checkAvailability('pants', 'Favorite Supply Co.');
const checkBags = checkAvailability('bags', 'Favorite Supply Co.')

Promise.all([checkSunglasses, checkPants, checkBags]).then(onFulfill).catch(onReject);

require로 자바스크립트 파일을 불러오는 시점에서 모든 코드는 읽히고 실행됩니다. 다만 module.exports로 통해 다른 파일에서 해당 객체에 접근할 수 있는지가 정해집니다. 만약 다음과 같은 코드가 있다고 합시다.

// outer.js

const value = "3";

console.log("outer");

function test() {
    return value;
}

module.exports = { test };
// other.js
const { test }  = require("outer.js");
console.log(test());

이 상태에서 other.js를 실행하면 다음처럼 나올 것입니다.

outer
3

즉, 외부로 코드를 공개하지 않아도, 내부적으로 코드를 실행하는 데는 지장이 없으며, 다만 다른 파일에서 코드로 해당 객체엔 접근만 불가능할 뿐인 상태가 됩니다.

1개의 좋아요

만약 restockSuccess 를 다른 파일에서 "별도"로 불러 오려고 하면 export를 해야 하겠죠. 그러나 이번 경우는 그런 것이 아니고 외부 파일에서 checkAvailability를 불러서 사용하는 것이기 때문에 checkAvailability만을 export하면 됩니다. 그러면 checkAvailability가 불러져서 실행될 때 checkAvailability 안에 있는 restockSuccess가 실행되니까요.