Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
260 views
in Technique[技术] by (71.8m points)

(0, func)(params)的写法是为了什么?

今天在看css-loader源码的时候,看到很多如下形式的函数调用:

// 顶部的导入
var _loaderUtils = require("loader-utils");
var _utils = require("./utils");

// css-loader  dist/index.js:35
const options =?(0, _loaderUtils.getOptions)(this)?||?{};

// css-loader  dist/index.js:44~46
if ((0, _utils.shouldUseModulesPlugins)(options.modules, this.resourcePath))?{
  plugins.push(...(0, _utils.getModulesPlugins)(options, this));
}

// css-loader  dist/index.js:132~134
const importCode =?(0, _utils.getImportCode)(this, exportType, imports, esModule);
const moduleCode =?(0, _utils.getModuleCode)(result, exportType, sourceMap, apiImports, urlReplacements, icssReplacements, esModule);
const exportCode =?(0, _utils.getExportCode)(exports, exportType, localsConvention, icssReplacements, esModule);

据观察基本就是在调用外部导入模块的方法时,都用形如(0, _obj.func)(params)的方式来调用。
请问这是出于什么考虑?


Update:

找了css-loader的真正源码(上面是在node_modules里看的dist文件),如下:

import {
  shouldUseModulesPlugins,
  // ...
} from './utils';

const rawOptions = getOptions(this);
if (shouldUseModulesPlugins(options)) {
  plugins.push(...getModulesPlugins(options, this));
}

都是正常的写法,dist内文件是babel转译后输出的,对比之后觉得应该就是下面两个回答说的 “为了获得obj.func引用但this不指向obj” ,以确保和原代码调用方式一致,且(0, func)()的方式比用var tmp = obj.func; tmp()更简洁且节省了一个变量。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

目的是执行函数但不把函数内部 this 指向obj:

(0, obj.fn)();
// vs
var tmp = obj.fn;
tmp();

逗号运算符就是为了得到 fn 的引用并脱离obj然后调用,省了一个中间变量。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...